Log4j2配置疑问:能否在类级别指定Logger?
Log4j2类级别Logger配置问题解答
嘿,我来帮你搞清楚这个问题!首先明确说:Log4j2完全支持在类级别指定Logger,不是必须用包级别的配置——你的抽象类配置没生效,是因为抽象类的使用方式导致的,不是Log4j2不支持类级别配置。
为什么你的类级别配置没生效?
你提到的com.foo.Bar.MyApp是抽象类,而抽象类本身不会被直接实例化,实际运行时调用日志的是它的子类。这里的关键是:
- 如果你的子类里是用
LogManager.getLogger(getClass())(或者用Lombok的@Slf4j默认也是这种方式),那么实际使用的Logger名称是子类的全类名(比如com.foo.Bar.MyAppImpl),而不是抽象类MyApp的名字。 - 这种情况下,你配置的
name="com.foo.Bar.MyApp"的Logger自然不会匹配到子类的日志请求,所以看起来“无效”。
而包级别的name="com.foo.Bar"会匹配该包下所有类(包括子类)的Logger,所以能生效。
解决方案
根据你的需求,有几种处理方式:
- 统一抽象类的Logger实例:在抽象类
MyApp里直接指定Logger为抽象类本身,所有子类继承这个Logger:
这样不管子类是谁,日志都会使用// 在抽象类MyApp中 private static final Logger log = LogManager.getLogger(MyApp.class);com.foo.Bar.MyApp这个Logger,你的类级别配置就能生效了。 - 配置子类的Logger:如果需要针对不同子类单独配置,直接把Logger的
name写成子类的全类名,比如:<Logger name="com.foo.Bar.MyAppImpl" level="trace" additivity="false"> <AppenderRef ref="stdout" level="all"/> </Logger> - 使用通配符匹配子类:如果想匹配所有
MyApp的子类,可以用通配符*:<Logger name="com.foo.Bar.MyApp*" level="trace" additivity="false"> <AppenderRef ref="stdout" level="all"/> </Logger>
你的配置代码整理
你给出的两段配置,正确的代码块格式如下:
无效的类级别配置(针对抽象类)
<!-- Doesn't work --> <Logger name="com.foo.Bar.MyApp" level="trace" additivity="false"> <AppenderRef ref="stdout" level="all"/> </Logger>
有效的包级别配置
<!-- Works --> <Logger name="com.foo.Bar" level="trace" additivity="false"> <AppenderRef ref="stdout" level="all"/> </Logger>
内容的提问来源于stack exchange,提问作者user1142317
相关产品推荐
相关产品推荐

