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
|
}
|