master
2022-03-28 b0ee3100f52959ca40b604ec12d7b32ce55c61d7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
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
}