JS WEB框架Express日志模块winston和express-winston以及winston-daily-rotate-file优化

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"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值