当前位置: 首页 > 知识库问答 >
问题:

Log4j2不同级别的不同附加器

牧业
2023-03-14

我有点小问题,找不到解决办法。我想为级别信息而不是级别警告设置图案布局。如果我有一个级别信息的日志,一切都正常,但是如果日志是级别WARN,它会被写入控制台两次(作为级别信息和作为级别警告)。只需将特定级别的所有日志写入该级别和以下级别的us日志即可。

我想将级别信息写入控制台,如:“%-5level%d{dd-MM-yyyy HH:MM:ss}%msg%n”和级别警告“%-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个答案

巫马庆
2023-03-14

据我所知,您希望日志事件的警告级别或更高级别(警告、错误、致命)仅转到“ConsoleWarning”附录,而不是同时转到“ConsoleWarning”和“ConsoleInfo”。

要做到这一点,最简单的方法是修改“ConsoleInfo”附件中的过滤器配置,基本上采用与此相反的方法:

<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手册指出:

如果LogEvent中的级别与html" target="_blank">配置的级别相同或更具体,则此筛选器返回onMatch结果,否则返回onMismatch值。例如,如果ThresholdFilter配置为levelerror,并且LogEvent包含leveldebug,那么将返回onMismatch值,因为错误事件比DEBUG更具体。

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

另一种可能的解决方案是使用RoutingAppender为每个级别指定目的地。如果这样做,那么根本不需要阈值过滤器。还请注意,您可以通过不提供默认路由和不提供该级别的路由来忽略特定级别的事件。例如,如果删除

<?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>

希望这能有所帮助!

 类似资料:
  • 我不熟悉Log4j2,我不知道如何在两个appender中设置两个不同的级别,例如我想在自级别错误,在控制台中自级别调试,以下是我的属性文件:

  • 我使用的是,试图将不同的日志消息发送到同一个记录器中的不同appender。这种情况在log4j2常见问题解答中有详细描述,但我需要使用log4j2。属性配置文件,而不是示例中给出的XML配置。 这里给出了另一个XML配置文件的例子——本质上,我不知道如何指定行 在语法。

  • 问题内容: 我的logback.xml中有这个添加器 因此,目前我将所有日志保存到一个文件中。如何使它像一个文件仅保存错误日志,而另一个文件保存所有其他日志? 我想在代码中仅使用1个logger实例,如下所示: 问题答案: 开始寻找logback类别,找到过滤器。 只需将过滤器说明添加到您的附加程序即可:

  • 下面,我有一个全局应用的日志回溯配置。 我想全局使日志记录级别错误,除了一个类。对于一个特定的类,我想使日志记录级别 INFO。我该怎么做?

  • 我们有两个不同的ASP.NET应用程序启用了Log4net日志记录。它们都有相同的log4net1.2.10.0版本。

  • 我想做的很直截了当: 我只希望在控制台追加器上显示重要的消息,而我希望将详细的消息路由到文件追加器。 我还尝试向添加一个ThresholdFilter,但这也不能过滤它。