【问题标题】:How can I use Marker in log4j.properties to filter some log?如何在 log4j.properties 中使用 Marker 过滤一些日志?
【发布时间】:2018-05-18 01:31:05
【问题描述】:

我在我的程序中使用了这个,但是如何在 log4j.properties 中过滤这个日志。

Marker marker = MarkerFactory.getMarker("tp-count");
log.info(marker, "The num of tp is {}", 10);

log4j.properties 是这样的:

log4j.rootLogger=info,F
log4j.appender.F=org.apache.log4j.RollingFileAppender
log4j.appender.F.File=client.log
log4j.appender.F.MaxBackupIndex=10
log4j.appender.F.MaxFileSize=100MB
log4j.appender.F.layout=org.apache.log4j.PatternLayout
log4j.appender.F.layout.ConversionPattern=[%d] %p %m (%c)%n

【问题讨论】:

    标签: java logging


    【解决方案1】:

    假设您使用的是 log4j 2.0,您可以使用 MarkerFilter 过滤您的日志,如 manual 中所述

    另外请注意,您需要从properties 配置切换到xml 配置,以便启用对过滤器的支持,如here 所述。您只是无法使用properties 方法实现过滤!

    您可以使用此online tool 快速将属性转换为 xml。请咨询手册的this section,以确保您的 log4j2.xml 放置和命名正确,以便您的应用程序自动获取它

    您的最终 log4j2.xml 可能如下例所示:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
    <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
        <appender name="F" class="org.apache.log4j.RollingFileAppender">
    
            <!-- below forces inclusion of only log events with marker 'tp-count' to this client.log-->
            <MarkerFilter marker="tp-count" onMatch="ACCEPT" onMismatch="DENY"/>
    
            <param name="File" value="client.log"/>
            <param name="MaxBackupIndex" value="10"/>
            <param name="MaxFileSize" value="100MB"/>
            <layout class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern" value="[%d] %p %m (%c)%n"/>
            </layout>
        </appender>
        <root>
            <level value="INFO"/>
            <appender-ref ref="F"/>
        </root>
    </log4j:configuration>
    

    【讨论】:

    【解决方案2】:

    问题是关于将Marker 与通过属性文件的配置结合使用。我将为 log4j2 版本 2.11 回答。举个例子。

    示例项目文件:

    log4j2.properties

    status = error
    
    
    appender.ana_whitespace.type = RollingFile
    appender.ana_whitespace.name = ana_whitespace
    appender.ana_whitespace.fileName = ${sys:es.logs.base_path:-target}${sys:file.separator}ana_whitespace.log
    appender.ana_whitespace.filter.1.type = MarkerFilter
    appender.ana_whitespace.filter.1.onMismatch=DENY
    appender.ana_whitespace.filter.1.onMatch=ACCEPT
    appender.ana_whitespace.filter.1.marker=ANA_WHITESPACE
    appender.ana_whitespace.policies.type = Policies
    appender.ana_whitespace.policies.time.type = TimeBasedTriggeringPolicy
    appender.ana_whitespace.policies.time.interval = 1
    appender.ana_whitespace.policies.time.modulate = true
    
    rootLogger.level = info
    rootLogger.appenderRef.ana_whitespace.ref = ana_whitespace
    

    Java 代码示例

    package de.es.stemmer;
    
    import java.io.IOException;
    import java.util.Map;
    import java.util.TreeMap;
    
    import org.apache.http.client.ClientProtocolException;
    import org.apache.logging.log4j.LogManager;
    import org.apache.logging.log4j.Logger;
    import org.apache.logging.log4j.Marker;
    import org.apache.logging.log4j.MarkerManager;
    import org.apache.logging.log4j.ThreadContext;
    import org.apache.logging.log4j.core.LoggerContext;
    import org.apache.logging.log4j.message.ObjectMessage;
    
    public class JsonLoggerTest {
        final static Logger log = LogManager.getLogger(JsonLoggerTest.class);
        final static Marker MARKER_WHITESPACE = MarkerManager.getMarker("ANA_WHITESPACE");
    
        public static void main(String[] args) throws ClientProtocolException, IOException {
            System.setProperty("es.logs.base_path", "target");
            LoggerContext.getContext().reconfigure();
            log.info(MARKER_WHITESPACE, "msg_sourceSnippet whitespace");
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-27
      • 1970-01-01
      • 1970-01-01
      • 2016-03-22
      • 2022-09-24
      • 1970-01-01
      • 2019-02-23
      相关资源
      最近更新 更多