Quarkus开启异步日志后启动崩溃无日志输出如何优化?
Quarkus异步日志启动崩溃丢失问题解决方案
问题根因:开启quarkus.log.async=true后,所有日志会先进入内存队列再异步刷出到日志目标端,如果应用启动阶段触发崩溃导致JVM直接终止,队列中未刷出的日志会直接丢失,无法输出。
可采用以下组合方案解决:
- 配置异步日志关闭等待超时
Quarkus异步日志默认不会等待队列中剩余日志处理完成就会随进程退出,你可以添加配置延长关闭等待时间,单位为毫秒:
该配置只在JVM收到正常终止信号时生效,针对# JVM退出时最多等待10秒让异步日志队列处理完成 quarkus.log.async.shutdown-timeout=10000kill -9强制杀进程的场景无效 - 高优先级日志强制同步输出
单独配置一个同步日志处理器,仅处理ERROR及以上级别的致命日志,不进入异步队列,从根源避免崩溃相关的高优先级日志丢失:# 保留原有异步日志配置,处理INFO及以下级别日志 quarkus.log.async=true quarkus.log.level=INFO # 新增同步控制台处理器,仅处理ERROR级别日志 quarkus.log.console.sync=true quarkus.log.console.level=ERROR quarkus.log.console.enable=true # 异步处理器处理低于ERROR的日志 quarkus.log.async.level=INFO - 调整异步队列溢出策略
默认异步队列满后会直接丢弃新日志,你可以修改配置避免日志丢弃,同时调大队列容量适配峰值流量:# 异步队列满时阻塞日志打印线程,不丢弃日志 quarkus.log.async.overflow-action=BLOCK # 调大异步队列长度,根据业务日志峰值调整 quarkus.log.async.queue-length=10240 - 配置JVM独立崩溃日志
针对JVM层面的致命崩溃(如OOM、JNI调用错误、段错误),额外配置JVM启动参数输出独立的崩溃日志,不受应用日志体系影响:java -XX:ErrorFile=/var/log/quarkus/hs_err_pid%p.log \ -XX:+HeapDumpOnOutOfMemoryError \ -XX:HeapDumpPath=/var/log/quarkus/ \ -jar your-quarkus-app.jar
内容的提问来源于stack exchange,提问作者mangusbrother
相关产品推荐
相关产品推荐

