当前位置: 首页 > 知识库问答 >
问题:

LOGBACK:如何使用JSOLayout记录整个msg

韦棋
2023-03-14

我们正在将日志从文本更改为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);
{
    "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"
}

共有1个答案

阎鸿煊
2023-03-14

如下所示定义一个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);
 类似资料:
  • 问题内容: 我想在我的应用程序中将slf4j + logback用于两个目的-日志和审计。 对于日志记录,我以常规方式记录日志: 对于审计,我创建一个特殊的命名记录器并登录到它: 登录配置: 问题:通过审核记录器记录的消息出现两次-一次在AUDIT_LOGGER下,一次在根记录器下。 14:41:57.975 [main]调试com.gammay.example.Main–> main() 14:

  • 因此,我正在部署一个使用Hibernate4.3.6的web应用程序。和Tomcat 7。我正在尝试使用SLF4J作为日志抽象层来日志。但是,我有很多问题和疑问。首先,Hibernate和Tomcat都有不同的日志框架,分别是jboss-logging和juli(即使我在库中找不到juli),所以我认为我必须安装从这些框架到SLF4J的桥梁。对于Hibernate,根据这个答案,一个解决方案可以是

  • 问题内容: 我正在迁移一个曾经使用log4j进行logback / slf4j的应用程序,并且已经出现问题约2周了……我做了一个小项目来测试logback / slf4j,它的工作效果很好,但是由于某种原因,在应用它时到实际的应用程序,它只是不想工作。 我正在使用JBoss 6.2,将EAR部署到standalone / deployments目录并启动服务器(除了我得到这个异常的事实,这一切都很

  • 我在具有以下logback.xml文件的类路径中有slf4j和logback jar(该文件以前已经成功使用过)。但是,DOCX4J3.0仍然将日志记录信息打印到标准输出。我正在使用NetBeans7.4构建基于docx4j的应用程序。我想将日志级别更改为错误,并将其发送到日志文件中。不知道我错过了什么。任何帮助都是非常感谢的。

  • 问题内容: 我正在使用 Apache Commons Logging™ 。现在,我想使用实现,但是当我更改级别时,库中的记录器问世了。我希望它关闭它们。 有没有一种简单的方法可以更改整个软件包的日志级别(Log4j可以做到这一点)吗? 我试图设定 org.apache.commons.logging.simplelog.log.foo =致命 在属性文件中禁用记录器(将其设置为致命即可),但它不起

  • 我有一个多线程Java应用程序,每个线程都是一个扩展基类的类。其中一个线程偶尔会给基类中的一个方法大量机器生成的数据,而其他线程只给出少量的人类类型数据。我想在比机器数据更高的日志级别上记录这些人类类型的消息,但是由于基类是所有线程的一部分,我无法在代码中区分出来。 一种解决方案是通知扩展类中的基类在不同的级别上登录,但是我必须将这些知识硬编码到应用程序中,这很难看。 我想做的是通过我的logba