《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(); });

如此,每次路由便都无需再进行日志文件的判断、更新操作,妥妥地提升了路由的效率,提升了用户体验。

完美![]~( ̄▽ ̄)~*