logo头像

博学广问,自律静思

Spring框架下异步日志收集及验证是否生效

Logback+AsyncAppender

logback的介绍. Logback是由log4j创始人设计的另一个开源日志组件。 为了避免日志记录会给服务带来性能问题,在项目中决定采用“异步记录日志”进行记录。这里就要使用到Logback的AsyncAppender组件。简而言之,就是AsyncAppender会在请求处理的主线程以外新建一个子线程 -“日志记录线程”进行日志输出。避免日志输出造成主线程阻塞。 在运行过程中,主线程不会直接输出日志,而是将日志以Event的方式发给日志线程,Event在日志线程中会形成一条队列。而AsyncAppender的配置项很多都是对队列的配置,比如:

  • queueSize int BlockingQueue的最大容量,默认情况下,大小为256。
  • discardingThreshold int 默认情况下,当BlockingQueue还有20%容量,他将丢弃TRACE、DEBUG和INFO级别的event,只保留WARN和ERROR级别的event。为了保持所有的events,设置该值为0。
  • includeCallerData boolean 提取调用者数据的代价是相当昂贵的。为了提升性能,默认情况下,当event被加入到queue时,event关联的调用者数据不会被提取。默认情况下,只有”cheap”的数据,如线程名。

需要注意到点:

  • AsyncAppender只是实现将日志事件缓存到队列,具体怎么输出日志需要在 中实现,完整代码如下:
info {"service":"${appName}"} true 0 1000

Shutdown hook

为了在JVM虚拟机退出之前,能将日志线程的队列中的日志处理完毕,需要注册一个shutdown hook 详见: https://logback.qos.ch/manual/appenders.html#AsyncAppender

怎样验证异步日志收集是否生效

按照Logback的文档实现异步日志很简单,那么怎么验证异步日志有没有生效就是个问题。这里引入一个“VisualVM”工具,它可以列出一个Java进程所包含的线程。可以看到下面的AsyncAppender-Works-xxx就是日志收集线程。

扩展资料