var log4js = require('log4js') var logsConfig = require('../config/logs.js') const uuid = require('node-uuid') const mysql = require('../utils/mysql_db') const jwt = require('jsonwebtoken') const util = require('util') const verify = util.promisify(jwt.verify) let secret = 'FM_Monitor' const dbhandle = require('../utils/handle_db') //加载配置文件 log4js.configure(logsConfig) //调用预先定义的日志名称 var resLogger = log4js.getLogger('resLogger') var errorLogger = log4js.getLogger('errorLogger') var handleLogger = log4js.getLogger('handleLogger') var consoleLogger = log4js.getLogger() // 格式化日志文本 加上日志头尾和换行方便查看 ==> 普通日志、请求日志、响应日志、操作日志、错误日志 var formatText = { info: function(info) { var logText = new String() //响应日志头信息 logText += '\n' + '***************info log start ***************' + '\n' //响应内容 logText += 'info detail: ' + '\n' + JSON.stringify(info) + '\n' //响应日志结束信息 logText += '*************** info log end ***************' + '\n' return logText }, request: function(req, resTime) { var logText = new String() var method = req.method //访问方法 logText += 'request method: ' + method + '\n' //请求原始地址 logText += 'request originalUrl: ' + req.originalUrl + '\n' //客户端ip logText += 'request client ip: ' + req.ip + '\n' //开始时间 var startTime //请求参数 if (method === 'GET') { logText += 'request query: ' + JSON.stringify(req.query) + '\n' // startTime = req.query.requestStartTime; } else { logText += 'request body: ' + '\n' + JSON.stringify(req.body) + '\n' // startTime = req.body.requestStartTime; } //服务器响应时间 logText += 'response time: ' + resTime + '\n' return logText }, response: function(ctx, resTime) { console.log(ctx) var logText = new String() //响应日志开始 logText += '\n' + '*************** response log start ***************' + '\n' //添加请求日志 logText += formatText.request(ctx.request, resTime) //响应状态码 logText += 'response status: ' + ctx.status + '\n' //响应内容 logText += 'response body: ' + '\n' + JSON.stringify(ctx.body) + '\n' //响应日志结束 logText += '*************** response log end ***************' + '\n' if (ctx.body) { if ( Object.prototype.toString.apply(ctx.body.data) !== '[object Array]' && ctx.request.originalUrl.split('?')[0].indexOf('/user/') == -1 ) { logInsert(ctx, resTime, '响应日志') } } return logText }, handle: function(info) { var logText = new String() //响应日志开始 logText += '\n' + '***************info log start ***************' + '\n' //响应内容 logText += 'handle info detail: ' + '\n' + JSON.stringify(info).replace(/\\n/g, '\n') + '\n' //响应日志结束 logText += '*************** info log end ***************' + '\n' return logText }, error: function(ctx, err, resTime) { var logText = new String() //错误信息开始 logText += '\n' + '*************** error log start ***************' + '\n' //添加请求日志 logText += formatText.request(ctx.request, resTime) //错误名称 logText += 'err name: ' + err.name + '\n' //错误信息 logText += 'err message: ' + err.message + '\n' //错误详情 logText += 'err stack: ' + err.stack + '\n' //错误信息结束 logText += '*************** error log end ***************' + '\n' console.log(logText) logErrorInsert(ctx, err, resTime) return logText } } let logInsert = async function(ctx, resTime, log_type) { // const token = ctx.request.header.authorization.split(' ')[1] // let payload = await verify(token, secret) let author = ctx.request.header.authorization let payload = {} if (typeof author == 'undefined') { payload = {} } else { payload = await verify(author.split(' ')[1], secret) } let sql = `INSERT INTO sys_log (id,user,ip_address,response_time,response_status,response_method,originalUrl,message,create_time,log_type,params,logDes) VALUES ('${uuid.v4()}', '${payload.user_name}', '${ctx.request.ip}', '${resTime}', '${ctx.status}', '${ctx.request.method}', '${ctx.request.originalUrl.split('?')[0]}', '${ctx.message}', '${dbhandle.date_format(new Date(), 'YY-MM-DD hh:mm:ss')}', '${log_type}', '${ ctx.request.method == 'GET' ? querysour(JSON.stringify(ctx.request.query)) : querysour(JSON.stringify(ctx.request.body)) }', '${ ctx.request.method == 'GET' ? ctx.request.query.logDes ? ctx.request.query.logDes : '无描述' : ctx.request.body.logDes ? ctx.request.body.logDes : '无描述' }')` await mysql.query(sql) } let logErrorInsert = async function(ctx, err, resTime) { let author = ctx.request.header.authorization if (!typeof author == 'undefined') { let payload = await verify(author.split(' ')[1], secret) let sql = `INSERT INTO sys_log (id,user,ip_address,response_time,response_status,response_method,originalUrl,message,create_time,log_type,params,logDes) VALUES ('${uuid.v4()}', '${payload.user_name}', '${ctx.request.ip}', '${resTime}', '${ctx.status}', '${ctx.request.method}', '${ctx.request.originalUrl.split('?')[0]}', '${querysour(err.message.split(';')[0])}', '${dbhandle.date_format(new Date(), 'YY-MM-DD hh:mm:ss')}', '错误日志', '${ ctx.request.method == 'GET' ? querysour(JSON.stringify(ctx.request.query)) : querysour(JSON.stringify(ctx.request.body)) }', '${querysour(err.message.split(';')[0])}');` await mysql.query(sql) } } let logLogin = async function(ctx, resTime, user) { let sql = `INSERT INTO sys_log (id,user,ip_address,response_time,response_status,response_method,originalUrl,message,create_time,log_type,params,logDes) VALUES ('${uuid.v4()}', '${user}', '${ctx.request.ip}', '${resTime}', '${ctx.status}', '${ctx.request.method}', '${ctx.request.originalUrl.split('?')[0]}', '${ctx.message}', '${dbhandle.date_format(new Date(), 'YY-MM-DD hh:mm:ss')}', '登入登出', '--', '${ctx.request.body.logDes}');` await mysql.query(sql) } function querysour(e) { e = e.replace(/(^\s*)|(\s*$)/g, '') //先过滤掉字符串中的空格 //用test函数判断字符串中有没有定义的特殊字符 if (/(\"|\'|\~|\*|\?|\\)/g.test(e)) { //把匹配到的特殊字符替换成'////',再加上原来的字符 e = e.replace( /(\"|\'|\~|\*|\?|\\)/g, '/\\' + e.match(/(\"|\'|\~|\*|\?|\\)/g)[0] ) } return e } //封装普通日志 let logInfo = function(info) { if (info) { consoleLogger.info(formatText.info(info)) } } //封装响应日志 let logResponse = function(ctx, resTime) { if (ctx) { resLogger.info(formatText.response(ctx, resTime)) } } //封装操作日志 let logHandle = function(res) { if (res) { handleLogger.info(formatText.handle(res)) } } //封装错误日志 let logError = function(ctx, error, resTime) { if (ctx && error) { errorLogger.error(formatText.error(ctx, error, resTime)) } } module.exports = { logInfo, logResponse, logHandle, logError, logLogin }