Is there a Logback Layout that Creates JSON Objects with Message Parameters as Attributes?

后端 未结 5 745
天命终不由人
天命终不由人 2021-02-02 09:32

I want to send log events to Loggly as JSON objects with parameterized string messages. Our project currently has a lot of code that looks like this:

String some         


        
相关标签:
5条回答
  • 2021-02-02 09:38

    So for me I was trying to log execution times, I created a pojo called ExecutionTime with name, method, class, duration.

    I was then able to create it:

    ExecutionTime time = new ExecutionTime("Controller Hit", methodName, className, sw.getTotalTimeMillis());
    

    For logging I then used:

    private final Logger logger = LoggerFactory.getLogger(this.getClass());
    logger.info(append("metric", time), time.toString());
    

    Make sure you have:

    import static net.logstash.logback.marker.Markers.append;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    

    This will log something like this:

    {  
       "ts":"2017-02-16T07:41:36.680-08:00",
       "msg":"ExecutionTime [name=Controller Hit, method=setupSession, className=class com.xxx.services.controllers.SessionController, duration=3225]",
       "logger":"com.xxx.services.metrics.ExecutionTimeLogger",
       "level":"INFO",
       "metric":{  
          "name":"Controller Hit",
          "method":"setupSession",
          "className":"class com.xxx.services.controllers.SessionController",
          "duration":3225
       }
    }
    

    Might be a different set up as I was using logback-spring.xml to output my logs to json:

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
        <include resource="org/springframework/boot/logging/logback/base.xml"/>
        <property name="PROJECT_ID" value="my_service"/>
        <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <File>app/logs/${PROJECT_ID}.json.log</File>
            <encoder class="net.logstash.logback.encoder.LogstashEncoder">
                <fieldNames>
                    <timestamp>ts</timestamp>
                    <message>msg</message>
                    <thread>[ignore]</thread>
                    <levelValue>[ignore]</levelValue>
                    <logger>logger</logger>
                    <version>[ignore]</version>
                </fieldNames>
            </encoder>
            <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
                <maxIndex>10</maxIndex>
                <FileNamePattern>app/logs/${PROJECT_ID}.json.log.%i</FileNamePattern>
            </rollingPolicy>
            <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
                <MaxFileSize>20MB</MaxFileSize>
            </triggeringPolicy>
        </appender>
        <logger name="com.xxx" additivity="false" level="DEBUG">
            <appender-ref ref="FILE"/>
            <appender-ref ref="CONSOLE"/>
        </logger>
        <root level="WARN">
            <appender-ref ref="FILE"/>
        </root>
    </configuration>
    
    0 讨论(0)
  • 2021-02-02 09:38

    Here's a recently created project that provides a JSON-specific logging API and works with SLF4J:

    https://github.com/savoirtech/slf4j-json-logger

    0 讨论(0)
  • 2021-02-02 09:41

    Like already answered you'll get a one-dimensional JSON tree with MDC and/or using a Marker with logstash-logback-encoder.

    If you are also looking for the following:

    • codebooks for definition of logged datatype key and type,
    • configuration of log-aggregation tools (like elasticsearch)
    • generated Java helper-code for efficient and correct logging

    then try a project I've created: json-log-domain. It defines a simple YAML-format definition from which the above can be generated.

    An example helper-code statement would be

    logger.info(host("localhost").port(8080), "Hello world");
    

    while generated markdown would like something like this.

    0 讨论(0)
  • 2021-02-02 09:46

    You could use a Mapped Diagnostic Context to set a stamp for each of those type of log messages that you could then filter on once in loggly.

    According to the source of JsonLayout the stamp is stored as a separate value in the JSON.

    0 讨论(0)
  • 2021-02-02 09:50

    There is a JSON logstash encoder for Logback, logstash-logback-encoder

    0 讨论(0)
提交回复
热议问题