【问题标题】:LOGBACK : How to log entire msg using JSONLayoutLOGBACK : 如何使用 JSONLayout 记录整个 msg
【发布时间】:2019-12-27 08:45:27
【问题描述】:

我们正在将日志从 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 中的一些属性,但没有一个能解决我的问题。

那么我还能在这里尝试什么。

【问题讨论】:

  • layout.setIncludeException(true)?
  • @ei 知道如何处理这些转义序列

标签: java spring-boot log4j logback slf4j


【解决方案1】:

如下定义一个 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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-20
    • 1970-01-01
    • 2022-12-23
    • 1970-01-01
    • 1970-01-01
    • 2014-08-02
    相关资源
    最近更新 更多