[英]LOGBACK : How to log entire msg using JSONLayout
We are changing our logs from Text to JSON.我们正在将日志从文本更改为 JSON。 I used below code to implement JSON logs :
我使用以下代码来实现 JSON 日志:
LayoutWrappingEncoder layoutEncoder = new LayoutWrappingEncoder();
ch.qos.logback.contrib.json.classic.JsonLayout layout= new ch.qos.logback.contrib.json.classic.JsonLayout();
ch.qos.logback.contrib.jackson.JacksonJsonFormatter jsonFormatter=new ch.qos.logback.contrib.jackson.JacksonJsonFormatter();
jsonFormatter.setPrettyPrint(true);
layout.setJsonFormatter(jsonFormatter);
layout.setTimestampFormat("yyyy-MM-dd' 'HH:mm:ss.SSS");
layoutEncoder.setLayout(layout);
But I see that JSON logs are not printed entirely.但是我看到 JSON 日志没有完全打印出来。
{
"timestamp" : "2019-08-22 10:12:15.790",
"level" : "ERROR",
"thread" : "qtp1346354118-22",
"logger" :"com.SomeClass",
"message" : "Exception from : com.class.method() \n",
"context" : "default",
"exception" : "java.lang.NullPointerException: null\r\n"
}
Now, the exception are not printed with complete stack trace, like how they use to get logs in text logs.现在,异常不会与完整的堆栈跟踪一起打印,就像它们如何用于在文本日志中获取日志一样。 Also I could see new line escape sequence getting printed which also does not happen in text logs.
我也可以看到打印出新的换行序列,这在文本日志中也不会发生。
I tried exploring some properties in JSONLayout but none of them solved my problem.我尝试探索 JSONLayout 中的一些属性,但没有一个能解决我的问题。
So what else can I try here.那么我还能在这里尝试什么。
Define a CustomThrowableProxyConverter as follows and set it into your JsonLayout.如下定义一个 CustomThrowableProxyConverter 并将其设置到您的 JsonLayout 中。 It does the trick.
它可以解决问题。
CustomThrowableProxyConverter extends ThrowableHandlingConverter {
public CustomThrowableProxyConverter() {
}
@Override
public String convert(ILoggingEvent event) {
StringBuilder sb = new StringBuilder();
IThrowableProxy itp = event.getThrowableProxy();
if (itp instanceof ThrowableProxy) {
ThrowableProxy tp = (ThrowableProxy)itp;
sb.append(tp.getClassName() + ": " + tp.getMessage());
for (StackTraceElementProxy element : tp.getStackTraceElementProxyArray()) {
sb.append("\t\n");
sb.append(element.getSTEAsString());
}
return sb.toString();
}
return "";
}
}
Then set this into jsonLayout instance.然后将其设置为 jsonLayout 实例。
JsonLayout jsonLayout = new JsonLayout();
jsonLayout.setThrowableProxyConverter(new CustomThrowableProxyConverter());
jsonEncoder.setLayout(jsonLayout);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.