1.前言
1.Express的日志模块winston和express-winston已经提供了开箱即用的大多数功能,但是和其他语言相比,还缺失对日志记录的当前文件和行号的支持,需要自己实现,以此记录一下。
2.express-winston主要用于记录请求进入和结束时的一些信息,可以将req的请求地址,请求方法,查询参数,请求体参数等记录下来,可以将res的请求全程耗时等记录下来。
3.winston 用于业务代码中对需要记录日志的地方进行记录
4.winston-daily-rotate-file用户日志文件的自动滚存,压缩以及清理
2.版本
express-winston 4.2.0
winston 3.8.2
winston-daily-rotate-file 4.7.1
express 4.18.2
3.日志通道Transport
3.1控制台Transport
level是定义的常量日志级别
handleExceptions为true的话,会在日志中将发生异常的堆栈记录下来
format.combine中的format.label和format.timestamp会作为参数传递给myFormat({format: LOG_DATE_FORMAT}是对日期的格式化,否则是时间戳形式)
require('winston-daily-rotate-file');
require('winston');
const expressWinston = require('express-winston');
const {
createLogger, transports, format} = require("winston");
const {
LOG_LEVEL,
LOG_FILE_SIZE,
LOG_FILE_COUNT,
LOG_FREQUENCY,
LOG_DATE_FORMAT,
LOG_FILE_NAME,
LOG_FILE_DIR
} = require("../config/setting")
const consoleTransport = new transports.Console(
{
level: LOG_LEVEL,
handleExceptions: true,
format: format.combine(
format.label({
label: "ExpressApp"}),
format.timestamp({
format: LOG_DATE_FORMAT}),
myFormat
)
}
)
3.2日志文件Transport
dirname是日志文件存放的目录
filename是日志文件的文件名部分
datePattern是以’YYYY-MM-DD’格式化的日期,会拼接在文件名后面
zippedArchive为true的话,会对日志文件进行压缩保存
maxSize日志文件最大大小
maxFiles日志文件最大数量
require('winston-daily-rotate-file');
require('winston');
const expressWinston = require('express-winston');
const {
createLogger, transports, format} = require("winston");
const {
LOG_LEVEL,
LOG_FILE_SIZE,
LOG_FILE_COUNT,
LOG_FREQUENCY,
LOG_DATE_FORMAT,
LOG_FILE_NAME,
LOG_FILE_DIR
} = require("../config/setting")
const fileTransport = new (transports.DailyRotateFile)({
level: LOG_LEVEL,
dirname: LOG_FILE_DIR,
filename: LOG_FILE_NAME,
datePattern: 'YYYY-MM-DD',
format: format.combine(
format.label({
label: "ExpressApp"}),
format.timestamp({
format: LOG_DATE_FORMAT}),
// format.simple()
myFormat
),
handleExceptions: true,
handleRejections: true,
frequency: LOG_FREQUENCY,
zippedArchive: true,
maxSize: LOG_FILE_SIZE,
maxFiles: LOG_FILE_COUNT
})
4.日志记录格式myFormat
const myFormat = format.printf(({
level, label, message, fileName, lineNo, timestamp}) => {
let levelUp = level.toUpperCase()
// let msgStr = JSON.stringify(message)
return `${
timestamp} [${
label}] [${
fileName}] [${
lineNo} Line] [${
levelUp}]: ${
message}`;
});
5.业务日志记录实例LOGGER初始化以及优化
5.1初始化
exitOnError为true,winston会在遇到异常即刻停止运行,不再记录其它日志
require('winston-daily-rotate-file');
require('winston');
const expressWinston = require('express-winston');
const {
createLogger, transports, format} = require("winston");
const LOGGER = createLogger({
transports: [
consoleTransport,
fileTransport
],
exceptionHandlers: [
consoleTransport,
fileTransport
],
rejectionHandlers: [
consoleTransport,
fileTransport
],
exitOnError: true
});
5.2优化
1.重写LOGGER的各级别方法,将获取的文件名和行号通过meta传进去
2.我只重写了这几个级别,如需,其它可自己照样子重写
const {
getStackInfo} = require("../config/utils"