是否存在使用消息参数作为属性创建JSON对象的Logback布局?

我想将日志事件作为带有参数化字符串消息的JSON对象发送到Loggly。 我们的项目目前有很多代码如下:

String someParameter = "1234"; logger.log("This is a log message with a parameter {}", someParameter); 

我们目前正在使用Logback作为我们的SLF4J后端,而Logback的JsonLayout将我们的ILogEvent对象序列化为JSON。 因此,当我们将日志事件发送到Loggly时,它们看起来像这样:

 { "message": "This is a log message with a parameter 1234", "level": INFO, .... } 

虽然这确实有效,但它会为someParameter每个值发送一个不同的message字符串,这会使Loggly的自动filter无效。

相反,我想要一个创建如下所示的JSON的布局:

 { "message": "This is a log message with a parameter {}", "level": INFO, "parameters": [ "1234" ] } 

这种格式允许Loggly使用消息对所有日志事件进行分组。 This is a log message with a parameter ,无论someParameter的值someParameter

看起来Logstash的KVfilter做了类似的事情 – 有没有办法用Logback完成这个任务,没有编写自己的布局来执行ILogEvent对象的自定义序列化?

您可以使用映射的诊断上下文为每种类型的日志消息设置一个标记,然后您可以在loggly中过滤一次。

根据JsonLayout的来源,戳记存储为JSON中的单独值。

Logback有一个JSON logstash编码器, logstash-logback-encoder

这是一个最近创建的项目,它提供了一个特定于JSON的日志API并与SLF4J一起使用:

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

所以对我来说,我试图记录执行时间,我创建了一个名为ExecutionTime的pojo,名称,方法,类,持续时间。

然后我能够创建它:

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

为了记录我然后使用:

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

确保你有:

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

这将记录如下:

 { "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 } } 

可能是一个不同的设置,因为我使用logback-spring.xml将我的日志输出到json:

      app/logs/${PROJECT_ID}.json.log   ts msg [ignore] [ignore] logger [ignore]    10 app/logs/${PROJECT_ID}.json.log.%i   20MB           

就像已经回答的那样,你将获得一个带有MDC的一维JSON树和/或使用带有logstash-logback-encoder的Marker。

如果您还在寻找以下内容:

  • 用于定义已记录数据类型键和类型的代码簿,
  • 日志聚合工具的配置(如elasticsearch)
  • 生成Java帮助程序代码,以实现高效和正确的日志记录

然后尝试我创建的项目: json-log-domain 。 它定义了一个简单的YAML格式定义,可以从中生成上述内容。

一个示例帮助程序代码语句将是

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

虽然生成的降价会喜欢这样的东西。