在《log4js按分类和日期存储为多文件问题》一文中,曾提出一种解决方案,以解决日志文件的分类、分日期存储问题。但,在NestJS的实践中,却发现,实际的日志输出并不严格按照日期分文件存储,即,当天的日志有很大可能是和前一天的日志存储在同一个(前一天)日志文件中。
同时,中间件的方式也影响了路由的效率、性能。实际上,并不需要每个请求都判断是否需要更新并重新生成日志文件。
且在当天没有任何请求时,这一方式将导致没有新的日志文件生成,即,日志文件的更新依赖于每天的第一个请求。
为了解决这些问题,不得不对方案做一修正。
联想到在开发壁纸时,曾用到定时任务,自然而然,便想着也用定时任务来实现日志文件的更新问题。
代码如下:
typescriptCopy code- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
@Cron('0 0 * * *', {
name: 'updateLoggerContext'
})
updateContext() {
const today = moment().format('YYYY-MM-DD');
this.loggerNames.forEach((name) => {
this.loggers[name].clearContext();
this.loggers[name].addContext('logDay', today);
});
}
@Cron('0 0 * * *', {
name: 'updateLoggerContext'
})
updateContext() {
const today = moment().format('YYYY-MM-DD');
this.loggerNames.forEach((name) => {
this.loggers[name].clearContext();
this.loggers[name].addContext('logDay', today);
});
}
其中,日期的判断逻辑已经不需要了,因为每次执行方法时,已经是新的一天,因此,将其删去。
注意,在addContext
前需要clearContext
,且,并不是addContext
之后立马生成新的日志文件,而只是添加了一个“上下文”,日志文件的生成需要等到当天实际的第一条日志输出时。
同时,之前的中间件便可安全地将其删除了:
typescriptCopy code- 1
- 2
- 3
- 4
app.use((req: Request, res: Response, next: () => void) => {
logger.updateContext();
next();
});
app.use((req: Request, res: Response, next: () => void) => {
logger.updateContext();
next();
});
如此,每次路由便都无需再进行日志文件的判断、更新操作,妥妥地提升了路由的效率,提升了用户体验。
完美![]~( ̄▽ ̄)~*