我在使用log4j时遇到了日志记录问题。我使用configureAndWatch让log4j偶尔轮询以下配置,并更新日志记录:
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<!-- Write logs to a file -->
<appender name="DEBUGGING" class="org.apache.log4j.RollingFileAppender">
...
</appender>
<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
...
</appender>
...
<category name="com.ourinternalpackage" additivity="false">
<priority value="DEBUG"/>
<appender-ref ref="CONSOLE"/>
</category>
<root>
<level value="DEBUG"/>
<appender-ref ref="CONSOLE"/>
</root>
</log4j:configuration>
这样做效果很好。我所期望的一切最终都会被记录到控制台。现在我添加(在根元素之前):
<category name="com.ourinternalpackage.somesubpackage.SomeClass" additivity="true">
<priority value="DEBUG"/>
<appender-ref ref="DEBUGGING"/>
</category>
现在,不出所料,来自SomeClass的日志消息最终出现在调试日志文件中,并被记录到控制台。太棒了!但是,当我将名为"com.ourinternalpackage.somesubpackage.SomeClass“的类别的优先级更改为OFF时,登录到控制台也会被禁用。这是意想不到的,因为名为"com.ourinternalpackage“的类别仍然将其优先级设置为DEBUG,并且正在记录到控制台。来自com.ourinternalpackage中的类的其他调试级消息确实会在控制台日志中结束。此外,如果我从配置文件中删除带有调试的附加器引用的类别,它会将调试消息附加到日志中。
您知道如何在不重新启动应用程序的情况下打开和关闭特定类别/记录器的登录功能吗?在大多数情况下,名称为"com.ourinternalpackage“的类别的优先级将设置为INFO。在这种情况下,我可以将名为"com.ourinternalpackage.somesubpackage.SomeClass“的类别的优先级设置为INFO,以减少完成的日志记录数量,但我仍然会将日志记录到这两个文件。如果可能的话,这是我想要避免的。
发布于 2011-10-17 22:23:57
您知道如何在不重新启动应用程序的情况下打开和关闭特定类别/记录器的登录功能吗?
在之前的段落中,您说您已经通过将优先级设置为"OFF“来完成此操作。
如果我没理解错的话,那么你所描述的一切都是预期的log4j行为。您应该花一些时间了解log4j manual,以了解记录器和附加器是如何工作的。您似乎错误地期望同一个记录器可以配置为具有两个不同的优先级/级别。这不是它的工作方式。如果除了我引用的问题之外,您还有其他特定的问题,请明确地问出来。
更新:根据您的更新,您仍然需要阅读log4j手册。(它非常简短,易于阅读。)您有一个名为"com.ourinternalpackage.somesubpackage.SomeClass".的记录器它们只有一个,无论您是否在配置文件中显式地列出它,它的存在都是因为您的代码调用或导致调用Logger.getLogger(SomeClass.class)
。
您的一个记录器只能有一个优先级。当您定义<category name="com.ourinternalpackage.somesubpackage.SomeClass" ...
时,它的优先级来自那里,因为它与记录器完全匹配。如果您没有定义精确匹配,那么Logger将从其最近的祖先(即<category name="com.ourinternalpackage" ...
)继承其优先级。因此,当您添加精确匹配并将其设置为" off“时,预期(和展示的)行为是关闭该记录器的所有输出。
所以,你的问题的答案仍然是,“你已经在做了。”也就是说,您已经为特定的Logger打开和关闭了登录。只是你对记录器的概念有一个不正确的概念。当你只有一个时,你会认为你有两个记录器。您的问题的一个可能的解决方案是实际创建两个记录器。然后你可以按照你想要的方式单独控制它们。如果您创建了一个名为"com.ourinternalpackage.somesubpackage.SomeClass“的调试记录器和一个名为"debug.com.ourinternalpackage.somesubpackage.SomeClass",的调试记录器,那么您就建立了一个使用" debug”作为调试记录器前缀的先例,并且您可以使用一个配置项来控制整个调试记录器集:<category name="debug" ...
。
https://stackoverflow.com/questions/7794635
复制相似问题