是否存在使用消息参数作为属性创建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一起使用:
所以对我来说,我试图记录执行时间,我创建了一个名为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");
虽然生成的降价会喜欢这样的东西。
- Java,特定于类的exception与标准exception
- Hibernate-懒得初始化一个角色集合:beans.Language.patients,无法初始化代理 – 没有Session
- 请求调用session.invalidate()后,request.getSession(false)不返回null
- Netbeans Java Debugger声称((true && false)== true)
- 为什么输出此代码111111?
- 如何通过其属性获取枚举类型?
- 将标记添加到lucene令牌流
- generics奇怪 – 我可以在Map 中插入一个Long值,它会在运行时编译并且不会失败
- 在thread.sleep()之前JFrame没有更新