【问题标题】:log4j2 marker and isEnabledlog4j2 标记和 isEnabled
【发布时间】:2014-04-09 14:58:07
【问题描述】:

我正在尝试确定 Log4j 2 中的标记是否存在记录器。过滤器在实际记录时起作用。问题出在检查 isEnabled(level, marker) 时。如果 MakerFilters 处于配置级别,则它按预期工作。如果在记录器或附加器级别,则它绕过标记并仅考虑阈值级别。

查看文档,看起来如果接受/拒绝处于配置级别,那么它不会检查任何其他过滤器并且该状态将得到尊重,因此它在这里工作是有道理的。

我想弄清楚的是如何在 Logger 级别配置它,以便 Logger.isEnabled(Level,Marker) 响应与调用 Logger.log(Level,Marker,msg) 时相同。
有没有办法配置这个,或者这两种方法响应不同的预期行为?

测试使用:Log4j 2.0-rc1

谢谢

TestLog2.java

这里是检查每个标记是否启用的日志记录语句。 DB_OP 是 DB_DELETE 和 DB_QUERY 的父标记。

private final static Logger log = LogManager.getLogger(TestLog2.class);
public int method2(String string, int i) {
    Level logLevel = Level.INFO;
    log.entry(string, i);
    int x = i + 2;

    System.out.printf("Level: %s is enabled: %s%n", logLevel, log.isEnabled(logLevel));
    // This should return false
    System.out.printf("Level: %s : DB_DELETE is enabled: %s%n", logLevel, log.isEnabled(logLevel, DbMarkers.DB_DELETE.getMarker()));
    System.out.printf("Level: %s : DB_QUERY is enabled: %s%n", logLevel, log.isEnabled(logLevel, DbMarkers.DB_QUERY.getMarker()));
    System.out.printf("Level: %s : DB_OP is enabled: %s%n", logLevel, log.isEnabled(logLevel, DbMarkers.DB_OP.getMarker()));

    log.log(logLevel, DbMarkers.DB_OP.getMarker(), "This is a parent db marker message");
    // This should not print 
    log.log(logLevel, DbMarkers.DB_DELETE.getMarker(), "This is a delete marker message");
    log.log(logLevel, DbMarkers.DB_QUERY.getMarker(), "This is a query marker message");

    log.exit(x);
    return x;
}

Log4j2 配置

在记录器级别配置标记过滤器。设置为拒绝 DB_DELETE,但接受 DB_OP(包括 DB_QUERY)

<Configuration status="error" strict="true" name="XMLConfigTest"
    packages="org.apache.logging.log4j.test">
    <Appenders>
        <Appender type="Console" name="DB">
            <Layout type="PatternLayout"
                pattern="DB: %d{HH:mm:ss.SSS} [%t] %-5level %C{1}.%M %m %marker %ex%n" />
        </Appender>
        <Appender type="Console" name="STDOUT">
            <Layout type="PatternLayout" pattern="STDOUT: %d{HH:mm:ss.SSS} [%t] %-5level %C{1}.%M %m %marker %ex%n" />
        </Appender>
    </Appenders>

    <Loggers>
        <Logger name="net.dt.log.test2" level="info" additivity="false">
            <AppenderRef ref="DB" />
            <Filters>
                <Filter type="MarkerFilter" marker="DB_DELETE" onMatch="DENY" onMismatch="NEUTRAL" /> 
                <Filter type="MarkerFilter" marker="DB_OP" onMatch="ACCEPT" onMismatch="DENY" />
            </Filters>
        </Logger>
        <Root level="info">
            <AppenderRef ref="STDOUT">
                <Filter type="MarkerFilter" marker="DB_OP" onMatch="DENY" onMismatch="NEUTRAL" />
            </AppenderRef>
        </Root>
    </Loggers>

</Configuration>

输出

isEnabled 为所有标记查询返回 true。 不记录 DB_DELETE 日志条目。

STDOUT: 15:00:13.655 [main] ERROR TestLog1.method1 An error in TestLog1 : Should see this  
Level: INFO is enabled: true
Level: INFO : DB_DELETE is enabled: true  <---- This should be false
Level: INFO : DB_QUERY is enabled: true
Level: INFO : DB_OP is enabled: true
DB: 15:00:13.659 [main] INFO  TestLog2.method2 This is a parent db marker message DB_OP 
--- DB_DELETE log entry would be here if it was configured to accept. 
DB: 15:00:13.660 [main] INFO  TestLog2.method2 This is a query marker message DB_QUERY[ DB_OP ] 

Log4j2 配置

现在在配置级别使用过滤器

<Configuration status="error" strict="true" name="XMLConfigTest"
    packages="org.apache.logging.log4j.test">
    <Filters> 
        <Filter type="MarkerFilter" marker="DB_DELETE" onMatch="DENY" onMismatch="NEUTRAL" /> 
        <Filter type="MarkerFilter" marker="DB_OP" onMatch="ACCEPT" onMismatch="NEUTRAL" /> 
    </Filters> 
    <Appenders>
        <Appender type="Console" name="DB">
            <Layout type="PatternLayout"
                pattern="DB: %d{HH:mm:ss.SSS} [%t] %-5level %C{1}.%M %m %marker %ex%n" />
        </Appender>
        <Appender type="Console" name="STDOUT">
            <Layout type="PatternLayout" pattern="STDOUT: %d{HH:mm:ss.SSS} [%t] %-5level %C{1}.%M %m %marker %ex%n" />
        </Appender>
    </Appenders>

    <Loggers>
        <Logger name="net.dt.log.test2" level="info" additivity="false">
            <AppenderRef ref="DB" />
            <Filters>
                <Filter type="MarkerFilter" marker="DB_DELETE" onMatch="DENY" onMismatch="NEUTRAL" /> 
                <Filter type="MarkerFilter" marker="DB_OP" onMatch="ACCEPT" onMismatch="DENY" />
            </Filters>
        </Logger>
        <Root level="info">
            <AppenderRef ref="STDOUT">
                <Filter type="MarkerFilter" marker="DB_OP" onMatch="DENY" onMismatch="NEUTRAL" />
            </AppenderRef>
        </Root>
    </Loggers>

输出

现在 isEnabled 对于 DB_DELETE 返回 false,但对于其他 DB_OP 标记返回 true。

STDOUT: 15:24:33.565 [main] ERROR TestLog1.method1 An error in TestLog1 : Should see this  
Level: INFO is enabled: true
Level: INFO : DB_DELETE is enabled: false  <----- Now it shows as false
Level: INFO : DB_QUERY is enabled: true
Level: INFO : DB_OP is enabled: true
DB: 15:24:33.570 [main] INFO  TestLog2.method2 This is a parent db marker message DB_OP 
DB: 15:24:33.570 [main] INFO  TestLog2.method2 This is a query marker message DB_QUERY[ DB_OP ] 

【问题讨论】:

    标签: java logging log4j2


    【解决方案1】:

    log4j-Dev 邮件列表上目前正在讨论关于标记的讨论。您的输入和用例可能对实施者非常有用。你能把你的问题加入邮件列表吗?或者也许用您的示例配置和代码提出 Jira。

    猜你喜欢
    • 1970-01-01
    • 2021-11-17
    • 2014-04-04
    • 2021-02-28
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    • 1970-01-01
    • 2018-03-07
    相关资源
    最近更新 更多