首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对Log4j类别/记录器的更改会相互影响

对Log4j类别/记录器的更改会相互影响
EN

Stack Overflow用户
提问于 2011-10-17 21:41:28
回答 1查看 799关注 0票数 0

我在使用log4j时遇到了日志记录问题。我使用configureAndWatch让log4j偶尔轮询以下配置,并更新日志记录:

代码语言:javascript
运行
复制
<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>

这样做效果很好。我所期望的一切最终都会被记录到控制台。现在我添加(在根元素之前):

代码语言:javascript
运行
复制
    <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,以减少完成的日志记录数量,但我仍然会将日志记录到这两个文件。如果可能的话,这是我想要避免的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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" ...

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7794635

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档