当前位置: 首页 → 爱前端 → 

Node.js

log4js按分类和日期存储为多文件问题

 

log4js升级到2.x版本后,原先的dateFile不再支持按category输出单独文件,需转为multiFile形式。但,multiFile并不支持配置为按date输出单独文件。因此,需进行特殊处理。

修改配置如下:

 

appenders: {
    system: {
        type: 'multiFile',
        base: 'logs/',
        extension: '.log',
        property: 'logDay',
        compress: false,
        maxLogSize: 10485760,
        backups: 5
    }
}

然后通过addContext设置文件路径和文件名:

 

const logger = log4js.getLogger(loggers[key]);
logger.addContext('logDay', logger.category + '/' + moment().format('YYYY-MM-DD'));

但,设置之后,并未随时间变化而生成新的日志文件,即:文件名所取的时间为系统启动的时间,且不再更新(由此可知,同一模块的多次require只会执行一次,且,声明的模块变量只进行初始化一次)。即便将时间的取值改为对象或方法动态获取,依然无效。因此,需要寻找一种方法进行动态设置。

so,很自然地想到交由中间件进行处理,即,在所有路由之前,对当前日期进行判断,若有变化,则重新赋值。如下:

 

app.use(function (req, res, next) {
    updateContext();
    ……
    next();
});

 

updateContext: function () {
    const today = moment().format('YYYY-MM-DD');
    if (logDay !== today) {
        logDay = today;
        Object.keys(loggers).forEach((key) => {
            loggers[key].addContext('logDay', loggers[key].category + '/' + logDay);
        });
    }
}

如此,便解决日志信息同时按category和date分类存储的问题。详细内容,请移步:iFuyun on GitHub

🔚
 

*

*

*

*