简体   繁体   English

log4j2标记和isEnabled

[英]log4j2 marker and isEnabled

I am trying to determine if a logger exists for a Marker in Log4j 2. The filter works when actually logging. 我试图确定Log4j 2中是否存在Marker的记录器。实际记录时,过滤器起作用。 The problem is when checking isEnabled(level, marker). 问题是检查isEnabled(level,marker)时。 If the MakerFilters are at the Configuration level, then it works as expected. 如果MakerFilters在配置级别,则它将按预期工作。 If at the logger or appender level, then it bypasses the marker and considers only the threshold level. 如果处于记录器或附加程序级别,则它会绕过标记并仅考虑阈值级别。

Looking at the documentation, it looks like if accepted/denied is at the configuration level, then it will not check any other filters and that status will be honored, so that makes sense that it works here. 查看文档,看起来是否接受/拒绝是在配置级别,那么它将不检查任何其他过滤器,并且将保留该状态,因此在这里可以正常使用。

What I am trying to figure out is how to configure it at the Logger level so that Logger.isEnabled(Level,Marker) responds the same as when calling Logger.log(Level,Marker,msg). 我想弄清楚的是如何在Logger级别进行配置,以便Logger.isEnabled(Level,Marker)的响应与调用Logger.log(Level,Marker,msg)时的响应相同。
Is there a way to configure this or is it the expected behavior that the two methods respond differently? 有没有一种方法可以配置此配置,或者这是两种方法响应不同的预期行为?

Tests run using: Log4j 2.0-rc1 使用以下命令运行测试:Log4j 2.0-rc1

Thanks 谢谢

TestLog2.java TestLog2.java

Here the logging statements that check each Marker for being enabled. 这里的日志记录语句检查每个标记是否已启用。 DB_OP is a parent marker of DB_DELETE and DB_QUERY. 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 Config Log4j2配置

Config with marker filters at logger level. 在记录器级别配置标记过滤器。 Set to deny DB_DELETE, but accept DB_OP (includes DB_QUERY) 设置为拒绝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>

Output 产量

isEnabled returns true for all Marker queries. 对于所有标记查询,isEnabled返回true。 DB_DELETE log entry is not recorded. 不记录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 Config Log4j2配置

Now with the Filter at the Configuration Level 现在在配置级别使用过滤器

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

Output 产量

Now isEnabled returns false for DB_DELETE, but true for other DB_OP markers. 现在,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 ] 

There is currently a discussion going on on the log4j-Dev mailing list about markers. 目前在log4j-Dev邮件列表上正在进行有关标记的讨论。 Your input and use case may be very useful to the implementors. 您的输入和用例对实现者可能非常有用。 Could you join the mailing list with your question? 您可以提出问题加入邮件列表吗? Or perhaps raise a Jira with your example config & code. 或者用您的示例配置和代码来提出一个Jira。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM