code笔记: 使用node-log4js 去记录日志

前言

当项目上线后,依旧会遇到不符合预期的情况,这种情况下,一个适当的记录是非常重要的(同时,不具备的日志记录环节的系统是万万不可被投入生产的)

log4js-node是一款比较优秀的node日志存储框架,在开发java的过程中曾使用过log4j,尽管二者非常名字非常相似,但二者不是一样的,

当然,他们功能都非常强大:

  • 彩色控制台记录到stdout或stderr
  • 文件附加器,根据文件大小或日期可配置日志滚动
  • 连接器/快速服务器的记录器
  • 可配置的日志消息布局/模式
  • 不同日志类别的不同日志级别(将应用程序日志的某些部分设置为DEBUG,其他部分仅设置为ERRORS等)

不仅仅如此,它还具备:

设计思路

从某种角度来说,log4js开箱即用,我们只需要做好配置即可,所以这里做一层封装

首先准备配置文件(这里建议查看github文档或者查看源码去理解配置)

源码中配置文件的说明 TS

export interface Configuration {
  appenders: { [name: string]: Appender; };
  categories: { [name: string]: { appenders: string[]; level: string; enableCallStack?: boolean; } };
  pm2?: boolean;
  pm2InstanceVar?: string;
  levels?: Levels;
  disableClustering?: boolean;
}

编码

实现的配置文件 (这里使用日志文件取记录)

 /**
     * log4j
     */
    log4j: {

        //log4j配置项
        configuration: {
            //
            replaceConsole: true,
            //开启pm2
            pm2: true,

            appenders: {
                //控制台输出
                stdout: {
                    type: 'console'
                },

                trace: {
                    type: 'dateFile',
                    filename: '../logs/app/trace/',
                    pattern: 'yyyy-MM-dd.log',
                    //每个日志的最大存储空间
                    // maxLogSize: 10,
                    //包含模型
                    alwaysIncludePattern: true
                },

                debug: {
                    type: 'dateFile',
                    filename: '../logs/app/debug/',
                    pattern: 'yyyy-MM-dd.log',
                    //  maxLogSize: 10,
                    alwaysIncludePattern: true
                },
                info: {
                    type: 'dateFile',
                    filename: '../logs/app/info/',
                    pattern: 'yyyy-MM-dd.log',
                    // maxLogSize: 10,
                    alwaysIncludePattern: true
                },
                warn: {
                    type: 'dateFile',
                    filename: '../logs/app/warn/',
                    pattern: 'yyyy-MM-dd.log',
                   // maxLogSize: 10,
                    alwaysIncludePattern: true
                },
                error: {
                    type: 'dateFile',
                    filename: '../logs/app/error/',
                    pattern: 'yyyy-MM-dd.log',
                    //  maxLogSize: 10,
                    alwaysIncludePattern: true
                },
                fatal: {
                    type: 'dateFile',
                    filename: '../logs/app/fatal/',
                    pattern: 'yyyy-MM-dd.log',
                    //  maxLogSize: 10,
                    alwaysIncludePattern: true
                },

            },
            categories: {
                //appenders:采用的appender,取appenders项,level:设置级别
                trace: {appenders: ['stdout', 'trace'], level: 'trace'},
                debug: { appenders: ['stdout', 'debug'], level: 'debug' },
                default: {appenders: ['stdout', 'info'], level: 'info'},
                warn: {appenders: ['stdout', 'warn'], level: 'warn'},
                error: {appenders: ['stdout', 'error'], level: 'error'},
                fatal: {appenders: ['stdout', 'fatal'], level: 'fatal'},
            }
        },
        //日志输出级别
        levels: ['INFO','WARN','DEBUG'],
        //自定义格式化输出项
        format: '[:remote-addr :method :url :status :response-time ms][:referrer HTTP/:http-version :user-agent]'
    }

接着封装 LoggerFactory

const log4js = require('log4js');

/**
 * @author yichengxian
 * log4j 日志处理
 * how to use:</br>
 * // 获得lo记录gger对象 注意使用的是哪个 categories
 * const logger = LoggerFactory.getLogger('info');
 *
 * logger.debug('%s','debug日志');
 * logger.info('%s','info日志');
 * logger.error('%s','error日志');
 * //以上都会打入info categories 文件中
 *
 */
class LoggerFactory {

    /**
     * 配置log4j
     * @param configuration {Configuration}
     */
    static configure(configuration) {

        log4js.configure(configuration)
    }

    /**
     * app use this
     * @param app 
     * @param name 参照getLogger 方法
     * @param format 格式化输出 可不填
     */
    static useLogger(app, name, format) {
        let options = {};
        if (undefined !== format) {
            options.format = format;
        }
        app.use(log4js.connectLogger(this.getLogger(name),options));
    }

    /**
     * @param name 取categories项 可不填为默认的info
     * @return {Logger}
     */
    static getLogger(name) {
        const logger = log4js.getLogger(name || 'info');
        return logger;
    }


}

module.exports = LoggerFactory

配置express的使用:

 #先加载配置文件
 loggerFactory.configure(config.log4j.configuration);
 #use express app (中间件逻辑)
 loggerFactory.useLogger(app)

结语

日志记录的良好使用可以使用户快速定位到异常情况以及具体位置,将会解决燃眉之急。

水啊,log4js的设计惟妙惟肖,简单且又实用,简单的记录

本code源码:github.com/yichengxian…