当前位置: 首页 > 面试题库 >

log4j rootLogger似乎继承了其他记录器的日志级别。为什么?

平山
2023-03-14
问题内容

我有一个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链接的工作方式有点直觉(至少对我而言)。请参阅log4j手册。如果请求级别等于或高于最匹配的记录器的阈值,那么将接受该请求。一旦请求被接受,无论其阈值是多少,它都将由完整的祖先链处理!

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

log4j.additivity.SGSearch=false

这将导致记录器SGSearch处理的请求不再沿链传送。

另一个建议是:不要将记录器和附加器的名称相同,因为将来您或同事会混淆它们。记录器名称应指示要处理的日志类型,附加程序名称应指定记录的去向。因此,在这种情况下,我认为“
SGSearch”可能是记录器名称,并且应该将附加程序称为“ LocalSysLog”。

顺便说一句:我认为您可以通过将根记录器设置为较高的阈值并将其降低以用于特定记录器来做正确的事情。这样可以避免嘈杂的库造成混乱(Apache有一些臭名昭著的库)。



 类似资料:
  • 我在一个类中创建了3个不同的slf4j记录器: 奇怪的是,即使在调试级别配置了X.Y.Z.MyClass,MyClass-a和MyClass-b记录器也不是在调试级别记录日志,而是在配置的根级别记录日志(在我的例子中是info)。如下所示,即使为-a和-b指定特定的记录器也不起作用。在我将根更改为debug之前,它们不会在debug级别进行日志记录。真的被这个难住了,有什么想法吗?

  • 我使用Kubernetes作为cron作业运行python脚本。问题是,直到作业完成后,我才看到脚本的输出(可能需要一段时间才能运行)。我怀疑这是由于日志记录级别(--v选项)造成的,但在我的整个生命周期中,我都找不到它的文档(默认为--v=0)。如果我想增加输出内容的详细程度,是否有人知道“INFO”或“TRACE”的值(或者这些值是什么/定义在哪里)?提前谢谢你的帮助。 编辑:是否有人在Kub

  • 现在,问题是,当我以以下方式进行日志记录时: 尽管根记录器级别被设置为“错误”,但日志条目仍然存在于两个日志文件中。然而,当我去掉“it.pkg.testpkg.service”记录器(通过注释或删除它)时,条目停止进入根记录器。我不太清楚这是怎么回事。 目前,我已经找到了一个临时解决方案,方法是在“root_file_appender”中添加以下条目: 谢了。

  • 我正在将一个应用程序从Log4J 1.2.16迁移到Log4J 2.13.3。为此,我使用log4j21.2到2.13.3桥。在我自己的开发机器上,一切都运转良好。但是,当我将应用程序部署到测试服务器时,日志只会发送到根日志记录器,我定义的其他日志文件保持为空。 配置文件完全相同,只是附件中的路径不同。我的开发机器运行Windows,测试服务器运行Linux。该应用程序已部署到Weblogic 1

  • 我创建了一个Grails 2.4.5应用程序(),并在下添加了大量Groovy类。对于任何需要日志记录的类,我使用了注释,如下所示: Grails生成的类也是如此,比如控制器和服务(也就是说,我使用<code>@Slf4j</code>注释处理所有事情)。我终于可以在本地运行<code>myapp 这是我在中的日志配置: 我知道Grails使用log4j,但是我认为Grails自带SLF4J绑定,

  • 有没有办法在命令行上设置的日志级别?使用烘焙到JAR中的属性文件是不可行的,因为我希望在暂存和生产环境中使用相同的JAR,不同的是暂存环境具有更多详细的日志记录。