You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Quarkus日志配置useParentHandler不生效问题咨询

解决Quarkus分类日志跨文件重复输出的问题

我之前配置Quarkus日志分类时也碰到过一模一样的困扰,明明设置了useParentHandlers: false,子类分类的日志还是跑到父类的日志文件里。结合你的配置,我梳理几个核心原因和对应的解决办法:

1. 检查Root日志处理器的配置

最常见的问题是Root分类也引用了父类的文件处理器,导致所有符合级别要求的日志都会被Root处理器全局捕获,包括你想隔离的子类日志。

你需要确保Root分类的handlers不包含AB_LOG_FILE这类自定义处理器,或者把Root的日志级别设得更高(比如WARN),避免INFO级别的日志被无差别捕获。示例配置如下:

quarkus:
  log:
    # 先定义处理器的具体实现
    handlers:
      AB_LOG_FILE:
        kind: file
        path: ./logs/ab.log
        level: INFO
      ABCD_FILE:
        kind: file
        path: ./logs/abcd.log
        level: INFO
    category:
      "a.b.c.d":
        handlers: ABCD_FILE
        useParentHandlers: false
        level: INFO
      "a.b":
        handlers: AB_LOG_FILE
        useParentHandlers: false
        level: INFO
    # 配置Root分类,避免全局捕获
    root:
      handlers: []  # 清空Root的处理器,或只保留控制台输出
      level: WARN   # 将Root级别设为WARN,这样INFO日志不会被Root处理

2. 确保日志记录器名称与分类精确匹配

有时候代码中获取的日志记录器名称和配置的分类不一致,比如你在a.b.c.d包下的类,却错误地使用了a.b作为日志记录器名称,导致日志被父类分类的处理器捕获。

检查代码中获取日志记录器的方式,确保用类的全限定名或精确的分类名称:

// 正确方式:用当前类的全限定名获取日志记录器
private static final Logger LOGGER = LoggerFactory.getLogger(YourClassInABCD.class);

// 或者手动指定精确分类名称
private static final Logger LOGGER = LoggerFactory.getLogger("a.b.c.d");

3. 给分类添加精确过滤规则

如果上面的方法还是不行,可以给每个分类添加filter规则,强制限定只处理对应名称的日志记录器,避免前缀匹配带来的意外:

quarkus:
  log:
    category:
      "a.b":
        handlers: AB_LOG_FILE
        useParentHandlers: false
        level: INFO
        # 只匹配精确的"a.b"日志记录器
        filter: "loggerName == 'a.b'"
      "a.b.c.d":
        handlers: ABCD_FILE
        useParentHandlers: false
        level: INFO
        # 只匹配精确的"a.b.c.d"日志记录器
        filter: "loggerName == 'a.b.c.d'"

最后建议重启Quarkus应用,确保配置完全生效——有时候热重载可能不会正确加载日志配置的修改。

内容的提问来源于stack exchange,提问作者rsa

火山引擎 最新活动