为了账号安全,请及时绑定邮箱和手机立即绑定

为什么两个 Logger 不根据 Log4j 中的级别拆分消息?

为什么两个 Logger 不根据 Log4j 中的级别拆分消息?

拉丁的传说 2023-08-09 15:33:16
我想将所有记录器级别记录到文件中(FATAL-> ALL),并同时在控制台中显示错误级别及更高级别。我使用根记录器将所有级别记录到文件中,并使用单独的记录器将错误级别记录到控制台。我的 XML 配置文件如下所示:<?xml version="1.0" encoding="UTF-8"?><Configuration status="WARN">    <Appenders>        <Console name="Console" target="SYSTEM_OUT">            <PatternLayout                    pattern="%d{HH:mm:ss.SSS} [%t] %highlight{%level}{FATAL=bg_red, ERROR=red, WARN=yellow, INFO=blue} %logger{36} - %msg%n" disableAnsi="false"/>        </Console>        <File name="File" fileName="output.log" bufferedIO="true" >            <PatternLayout                    pattern="%d{HH:mm:ss.SSS} [%t] %highlight{%level}{FATAL=bg_red, ERROR=red, WARN=yellow, INFO=blue} %logger{36} - %msg%n"/>        </File>    </Appenders>    <Loggers>        <Root level="ALL">            <AppenderRef ref="File"/>        </Root>        <Logger name="com.danielk" level="ERROR">            <AppenderRef ref="Console"/>        </Logger>    </Loggers></Configuration>我希望在文件中拥有所有级别的日志记录,并且在控制台中只有“错误”及以上级别,但我在两者(控制台和文件)上都只有“错误”级别:23:19:54.422 [main] 错误 com.danielk.Example - 示例中的错误错误 23:19:54.434 [main] 错误 com.danielk.Main - 错误 ERROR ERROR FROM MAIN消息本身是正确构建的,因为当我将两个记录器(根记录器和附加记录器)设置为“全部”级别时,我可以看到所有类型的消息(不仅仅是“错误”级别)。我应该怎么做来分层:文件 - 所有级别控制台 - 仅错误及以上错误?
查看完整描述

1 回答

?
aluckdog

TA贡献1847条经验 获得超7个赞

您可以ThresholdFilter在控制台附加程序上使用来过滤掉具有ERROR或更特定级别的日志事件

整个配置例如:

<?xml version="1.0" encoding="UTF-8"?>

<Configuration status="WARN">

    <Appenders>

        <Console name="Console" target="SYSTEM_OUT">

            <PatternLayout

                    pattern="%d{HH:mm:ss.SSS} [%t] %highlight{%level}{FATAL=bg_red, ERROR=red, WARN=yellow, INFO=blue} %logger{36} - %msg%n"

                    disableAnsi="false"/>

            <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>

        </Console>

        <File name="File" fileName="output.log" bufferedIO="true" append="false">

            <PatternLayout

                    pattern="%d{HH:mm:ss.SSS} [%t] %highlight{%level}{FATAL=bg_red, ERROR=red, WARN=yellow, INFO=blue} %logger{36} - %msg%n"/>

        </File>

    </Appenders>

    <Loggers>

        <Root level="debug">

            <AppenderRef ref="File"/>

            <AppenderRef ref="Console"/>

        </Root>

    </Loggers>

</Configuration>

PS 当您指定:


<Logger name="com.danielk" level="ERROR">

   <AppenderRef ref="Console"/>

</Logger>

然后将日志级别设置ERROR为内部所有子包和类com.danielk(除非您配置更具体的记录器,例如com.danielk.db.MyClass使用不同的级别)。这就是日志文件中只出现错误的原因。


查看完整回答
反对 回复 2023-08-09
  • 1 回答
  • 0 关注
  • 80 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信