Logback:如何仅将错误记录到文件?

14

我已经阅读了2个小时的logback手册,仍然无法弄清楚如何做我需要的事情。

正如标题所说,这很简单:我想仅将错误日志记录到文件中,其他级别(包括ERROR)记录在控制台中。

这是我logcat.xml文件的根部分:

    <root level="TRACE" >
        <appender-ref ref="CONSOLE_APPENDER" />
        <appender-ref ref="FILE_APPENDER" />
    </root>

这个配置存在的问题是它会将所有大于等于TRACE级别的日志记录到两个appender中。我可以让根只使用控制台,并定义一个文件记录器。
    <logger name='file_logger' level='ERROR' >
        <appender-ref ref="FILE_APPENDER" />
    </logger>

但是我现在必须这样调用普通的日志记录器:

LoggerFactory.getLogger(ClientClass.class);

而文件记录器像这样:

LoggerFactory.getLogger("file_logger");

我不想为每个类选择记录器,我只想使用类作为参数从工厂获取根记录器,并让它根据级别执行正确的操作。这可能吗?

这个回答解决了您的问题吗?如何使用logback创建2个不同的ROOT记录器? - rogerdpack
3个回答

25
将以下内容放入您的文件附加程序定义中:
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
    <level>ERROR</level>
</filter>

ThresholdFilter位于logback-classic.jar中。


2
不错。我正在使用logback for android,看起来也很好用。 - Mister Smith
3
这也可以帮助你:XSD用于logback.xml。它可以帮助你配置变量。https://github.com/enricopulatzo/logback-XSD - az3
谢谢,你的方法可行。然而,这样做违背了root标签上level属性的初衷,因为它的主要功能是确定appender的日志级别。 - skryvets

8
我不明白为什么错误答案在这里被投票了。 这个人只想要文件中的错误信息。
以下是正确答案:
<filter class="ch.qos.logback.classic.filter.LevelFilter">
  <level>ERROR</level>
  <onMatch>ACCEPT</onMatch>
  <onMismatch>DENY</onMismatch>
</filter>

Reference: https://logback.qos.ch/manual/filters.html#levelFilter


这是因为被点赞的解决方案使用了 ThresholdFilter,该过滤器会过滤掉所有低于错误级别的内容。 - Kratos
我理解了。但我不明白它如何解决作者所述的问题。作者只想将错误记录到文件中。 - Anton Pryamostanov
好的观点。我们其余的人都认为他想要“错误及以上” :) 更新:看起来在logback领域,ERROR是最高级别,不像log4j有“fatal”,很奇怪...http://logback.qos.ch/manual/architecture.html#basic_selection - rogerdpack
我认为相反的是答案应该是什么。接受和拒绝应该交换位置。 - Hardik Rana
有些开发人员可以理解描述背后的问题,而其他人则会字面理解。显然,OP想要持久化他的错误消息。因此,如果存在严重级别,那么这些消息应该进入该日志文件。这就是日志_级别_的全部意义。有趣的对话:「致命消息?不,我们不能再看到它们了-你只想持久化错误」:) - steffen

2

Refer below code:

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>DENY</onMatch>
            <onMismatch>ACCEPT</onMismatch>
        </filter>
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接