加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – log4j rootLogger似乎继承了其他logger的日志级别.为什

发布时间:2020-12-15 02:49:24 所属栏目:Java 来源:网络整理
导读:我有一个log4J设置,其中根记录器应该将ERROR级别消息和上面的消息记录到控制台,另一个记录器将所有内容记录到syslog中. log4j.properties是: # Root logger optionlog4j.rootLogger=ERROR,Rlog4j.appender.R=org.apache.log4j.ConsoleAppenderlog4j.appende
我有一个log4J设置,其中根记录器应该将ERROR级别消息和上面的消息记录到控制台,另一个记录器将所有内容记录到syslog中.

log4j.properties是:

# Root logger option
log4j.rootLogger=ERROR,R

log4j.appender.R=org.apache.log4j.ConsoleAppender
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d %p %t %c - %m%n

log4j.logger.SGSearch=DEBUG,SGSearch
log4j.appender.SGSearch=org.apache.log4j.net.SyslogAppender
log4j.appender.SGSearch.SyslogHost=localhost
log4j.appender.SGSearch.Facility=LOCAL6
log4j.appender.SGSearch.layout=org.apache.log4j.PatternLayout
log4j.appender.SGSearch.layout.ConversionPattern=[%-5p] %m%n

在代码我做

private static final Logger logger = Logger.getLogger("SGSearch");
.
.
.
logger.info("Commencing snapshot index [" + args[1] + " -> " + args[2] + "]");

发生的事情是我获得了所有日志记录级别的控制台日志记录.似乎正在发生的事情是,SGSearch的级别会以某种方式覆盖根记录器的级别设置.我无法弄清楚.

我已经确认Log4J正在读取我认为的属性文件,而没有其他文件(通过-Dlog4j.debug选项)

解决方法

Log4j链接的工作方式有点反直觉(至少对我来说).请参阅 the log4j manual.如果请求级别等于或高于最具体的匹配记录器的阈值,则接受该级别.一旦请求被接受,它将由完整的祖先链处理,无论其阈值如何!

要抑制链接行为,请添加:

log4j.additivity.SGSearch=false

这将导致记录器SGSearch处理的请求不再向上传递.

另一个建议是:不要将您的记录器和追加器命名为相同,因为在将来的某个时刻,您或同事会混淆它们.记录器名称应指示处理哪种类型的日志记录,appender名称应指定日志记录的位置.所以在这种情况下,我认为“SGSearch”可能是记录器名称,而appender应该被称为“LocalSysLog”.

顺便说一句:在我看来,你通过限制具有高阈值的根记录器并针对特定记录器降低它来做正确的事情.这避免了大声库的混乱(Apache有一些臭名昭着的库).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读