Mus*_*ice 27 java json logback slf4j loggly
我想将日志事件作为带有参数化字符串消息的JSON对象发送到Loggly.我们的项目目前有很多代码如下:
String someParameter = "1234";
logger.log("This is a log message with a parameter {}", someParameter);
Run Code Online (Sandbox Code Playgroud)
我们目前正在使用Logback作为我们的SLF4J后端,而Logback的JsonLayout将我们的ILogEvent对象序列化为JSON.因此,当我们将日志事件发送到Loggly时,它们看起来像这样:
{
"message": "This is a log message with a parameter 1234",
"level": INFO,
....
}
Run Code Online (Sandbox Code Playgroud)
虽然这确实有效,但它会message为每个值发送一个不同的字符串someParameter,这使得Loggly的自动过滤器旁边无用.
相反,我想要一个创建如下所示的JSON的布局:
{
"message": "This is a log message with a parameter {}",
"level": INFO,
"parameters": [
"1234"
]
}
Run Code Online (Sandbox Code Playgroud)
这种格式允许Loggly将所有日志事件与消息This is a log message with a parameter组合在一起,而不管其值如何someParameter.
看起来Logstash的KV过滤器做了类似的事情 - 有没有办法用Logback完成这个任务,没有编写我自己的布局来执行ILogEvent对象的自定义序列化?
所以对我来说,我试图记录执行时间,我创建了一个名为ExecutionTime的pojo,名称,方法,类,持续时间.
然后我能够创建它:
ExecutionTime time = new ExecutionTime("Controller Hit", methodName, className, sw.getTotalTimeMillis());
Run Code Online (Sandbox Code Playgroud)
为了记录我然后使用:
private final Logger logger = LoggerFactory.getLogger(this.getClass());
logger.info(append("metric", time), time.toString());
Run Code Online (Sandbox Code Playgroud)
确保你有:
import static net.logstash.logback.marker.Markers.append;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Run Code Online (Sandbox Code Playgroud)
这将记录如下:
{
"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
}
}
Run Code Online (Sandbox Code Playgroud)
可能是一个不同的设置,因为我使用logback-spring.xml将我的日志输出到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>
Run Code Online (Sandbox Code Playgroud)
您可以使用映射的诊断上下文 为每种类型的日志消息设置一个标记,然后您可以在loggly中过滤一次.
根据JsonLayout的来源,戳记存储为JSON中的单独值.