Log4j2针对不同级别的不同appender

时间:2017-04-16 20:22:09

标签: log4j2

我有一点问题但无法找到解决方案。我想为级别信息设置模式布局而不是级别警告。如果我有登录级别INFO,一切正常,但如果日志是级别WARN,则会将其写入控制台两次(作为级别信息和级别警告)。只需将特定级别的所有日志写入我们的日志级别和下面的级别。

我想登录级别INFO写入控制台,如:"%-5level %d{dd-MM-yyyy HH:mm:ss} %msg%n"和级别WARN,如"%-5level %d{dd-MM-yyyy HH:mm:ss} [%l] %msg%n"

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
    <Appenders>        
        <Console name="ConsoleInfo" target="SYSTEM_OUT">
            <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="%-5level %d{dd-MM-yyyy HH:mm:ss} %msg%n"/>
        </Console>     
        <Console name="ConsoleWarning" target="SYSTEM_OUT">
            <ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="%-5level %d{dd-MM-yyyy HH:mm:ss} [%l] %msg%n"/>
        </Console>   
        <File name="File" fileName="logs/cli.log">
            <PatternLayout pattern="%-5level %d{dd-MM-yyyy HH:mm:ss} [%l] %msg%n"/>
        </File>
    </Appenders>

    <Loggers> 
        <Root level="ALL">
            <AppenderRef ref="ConsoleInfo"/>
            <AppenderRef ref="ConsoleWarning"/>
            <AppenderRef ref="File"/>    
        </Root>
    </Loggers>
</Configuration>

1 个答案:

答案 0 :(得分:1)

根据我的理解,您希望将具有WARN或更高级别(WARN,ERROR,FATAL)的日志事件转到&#34; ConsoleWarning&#34;仅仅是appender而不是同时使用#34; ConsoleWarning&#34;和&#34; ConsoleInfo&#34;。

最简单的方法是在您的&#34; ConsoleInfo&#34;中修改您的过滤器配置。 appender基本上做了相反的方法:

<Console name="ConsoleInfo" target="SYSTEM_OUT">
    <ThresholdFilter level="WARN" onMatch="DENY" onMismatch="ACCEPT"/>
    <PatternLayout pattern="%-5level %d{dd-MM-yyyy HH:mm:ss} %msg%n"/>
</Console>   

这可行,因为log4j2 manual states

  

如果LogEvent中的级别与配置级别或更具体相同,则此过滤器返回onMatch结果,否则返回onMismatch值。例如,如果ThresholdFilter配置了Level ERROR且LogEvent包含Level DEBUG,那么将返回onMismatch值,因为ERROR事件比DEBUG更具体。

这将导致appender仅接受级别低于WARN的事件。

另一种可能的解决方案是使用RoutingAppender来指定每个级别的目标。如果你这样做,那么根本不需要ThresholdFilters。另请注意,您可以通过不提供默认路由并且不为该级别提供路由来忽略特定级别的事件。例如,如果从下面的配置中删除<Route ref="ConsoleInfo" key="DEBUG" />,则路由选择器将忽略所有DEBUG事件,并且不会将其打印到控制台。这是配置:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
    <Appenders>        
        <Console name="ConsoleInfo" target="SYSTEM_OUT">
            <PatternLayout pattern="%-5level %d{dd-MM-yyyy HH:mm:ss} %msg%n"/>
        </Console>     
        <Console name="ConsoleWarning" target="SYSTEM_OUT">
            <PatternLayout pattern="%-5level %d{dd-MM-yyyy HH:mm:ss} [%l] %msg%n"/>
        </Console>   
        <File name="File" fileName="logs/cli.log">
            <PatternLayout pattern="%-5level %d{dd-MM-yyyy HH:mm:ss} [%l] %msg%n"/>
        </File>
        <Routing name="Routing">
            <Routes>
                <Script name="RoutingInit" language="JavaScript"><![CDATA[
                    logEvent.getLevel();]]>
                </Script>
                <Route ref="ConsoleInfo" key="TRACE" />
                <Route ref="ConsoleInfo" key="DEBUG" />
                <Route ref="ConsoleInfo" key="INFO" />
                <Route ref="ConsoleWarning" key="WARN" />
                <Route ref="ConsoleWarning" key="ERROR" />
                <Route ref="ConsoleWarning" key="FATAL" />
            </Routes>
        </Routing>
    </Appenders>

    <Loggers> 
        <Root level="ALL">
            <AppenderRef ref="Routing"/>
            <AppenderRef ref="File"/>    
        </Root>
    </Loggers>
</Configuration>

希望这有帮助!