java - LOGBACK : 如何使用 JSONLayout 记录整个 msg
问题描述
我们正在将日志从 Text 更改为 JSON。我使用下面的代码来实现 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);
但我看到 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"
}
现在,异常不会打印完整的堆栈跟踪,例如它们如何用于获取文本日志中的日志。我还可以看到新的换行序列被打印出来,这在文本日志中也不会发生。
我尝试探索 JSONLayout 中的一些属性,但它们都没有解决我的问题。
那么我还能在这里尝试什么。
解决方案
如下定义一个 CustomThrowableProxyConverter 并将其设置到您的 JsonLayout 中。它成功了。
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 "";
}
}
然后将其设置为 jsonLayout 实例。
JsonLayout jsonLayout = new JsonLayout();
jsonLayout.setThrowableProxyConverter(new CustomThrowableProxyConverter());
jsonEncoder.setLayout(jsonLayout);
推荐阅读
- tensorflow - 我可以将 VGG16 用于一个通道图像吗?
- jquery - 使用 Laravel Passport 使用 REST API 获取访问令牌时如何在客户端保留
- javascript - 带有 JavaScript 和 HTML 的 JSON
- css - 到页面末尾但不激活滚动的 CSS 块
- arrays - Angular中带有array.push()的无限循环
- google-bigquery - BigQuery 中的拒绝/不良记录表
- c++ - 构建时如何解决 ReLU is not a member of torch::nn 错误?
- java - 如何在 Spring 中使用(如果可能)Java 配置将 myBatis 与 OneToOne 关系结合使用?
- java - 使用一个唯一目的是将 2 个(非常相关的)对象组合在一起的类是否被认为是一个好主意?
- entity-framework-core - 将全局会话过滤器添加到存储库实体