Best way to write custom json messages using log4j2

后端 未结 3 1344
不思量自难忘°
不思量自难忘° 2020-12-30 13:54

I have been using log4j for different kind of projects and have some experience with log4j2. All implementations used the default appender and layout. Currently i need to wr

3条回答
  •  一整个雨季
    2020-12-30 14:23

    The question is about writing a custom json messages using log4j2.

    This is possible since version 2.11 of log4j2 version:

    https://issues.apache.org/jira/browse/LOG4J2-2190

    The new parameter of for JSONLayout is called

    objectMessageAsJsonObject

    . Sample project files;

    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.layout.type = JsonLayout
    appender.ana_whitespace.layout.propertiesAsList = false
    appender.ana_whitespace.layout.compact = false
    appender.ana_whitespace.layout.eventEol = true
    appender.ana_whitespace.layout.objectMessageAsJsonObject = true
    appender.ana_whitespace.layout.complete= true
    appender.ana_whitespace.layout.properties= true
    appender.ana_whitespace.filePattern = ${sys:es.logs.base_path:-target}${sys:file.separator}ana_whitespace-%d{yyyy-MM-dd}.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
    appender.ana_whitespace.policies.size.type = SizeBasedTriggeringPolicy
    appender.ana_whitespace.policies.size.size = 10 MB
    
    rootLogger.level = info
    rootLogger.appenderRef.ana_whitespace.ref = ana_whitespace
    

    Example Java code

    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");
            System.setProperty("es.logs.cluster_name", "_cluster");
            LoggerContext.getContext().reconfigure();
            ThreadContext.put("orig", "MDC_origValue");
            ThreadContext.put("source", "MDC_sourceSnippet");
            Map map = new TreeMap<>();
            map.put("orig", "msg_origValue");
            map.put("source", "msg_sourceSnippet");
            ObjectMessage msg = new ObjectMessage(map);
            log.info(MARKER_WHITESPACE, msg);
            ThreadContext.remove("orig");
            ThreadContext.remove("source");
        }
    
    }
    

    JSON Log Entry

    [
    {
      "thread" : "main",
      "level" : "INFO",
      "loggerName" : "de.es.stemmer.JsonLoggerTest",
      "marker" : {
        "name" : "ANA_WHITESPACE"
      },
      "message" : {
        "orig" : "msg_origValue",
        "source" : "msg_sourceSnippet"
      },
      "endOfBatch" : false,
      "loggerFqcn" : "org.apache.logging.log4j.spi.AbstractLogger",
      "instant" : {
        "epochSecond" : 1526576578,
        "nanoOfSecond" : 184000000
      },
      "contextMap" : {
        "orig" : "MDC_origValue",
        "source" : "MDC_sourceSnippet"
      },
      "threadId" : 1,
      "threadPriority" : 5
    }
    
    ]
    

提交回复
热议问题