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

log4j2的JsonLayout如何将堆栈跟踪打印成字符串一次

苏鸿才
2023-03-14

我的项目使用log4j2 2.13.3。
如下所示记录:

    "message": "404 NOT_FOUND \"Unable to find instance for xxx\"",
    "thrown": {
        "commonElementCount": 0,
        "localizedMessage": "404 NOT_FOUND \"Unable to find instance for xxx\"",
        "message": "404 NOT_FOUND \"Unable to find instance for xxx\"",
        "name": "org.springframework.cloud.gateway.support.NotFoundException",
        "suppressed": [
            {
                "commonElementCount": 0,
                "localizedMessage": "xxx\nStack trace:",
                "message": "xxx\nStack trace:",
                "name": "reactor.core.publisher.FluxOnAssembly$OnAssemblyException",
                "extendedStackTrace": "stack trace"
            }
        ],
        "extendedStackTrace": "stack trace"
    },

ExtendedStackTrace出现两次。有没有办法让堆栈跟踪出现一次。

像这样:(复制自http://logging.apache.org/log4j/log4j-2.2/manual/layouts.html#JSONLayout)

[
  {
    "logger":"com.foo.Bar",
    "timestamp":"1376681196470",
    "level":"INFO",
    "thread":"main",
    "message":"Message flushed with immediate flush=true"
  },
  {
    "logger":"com.foo.Bar",
    "timestamp":"1376681196471",
    "level":"ERROR",
    "thread":"main",
    "message":"Message flushed with immediate flush=true",
    "throwable":"stack trace"
  }
]

共有1个答案

郝哲茂
2023-03-14

如果您希望作为JSON登录,我建议您升级并使用新的JSONTemplateLayout。它使您可以对生成的输出进行更多的控制。

为了将日志记录到ELK堆栈,我更喜欢使用GELF布局和SocketAppender将日志发送到LogStash。有关更多信息,请参见登录云。

 类似资料:
  • 如何将堆栈跟踪打印到logcat? 当应用程序在Eclipse中运行并且应用程序崩溃时,我会在logcat窗口中收到一系列消息,如“致命异常:main”,并打印堆栈跟踪。但是,当我从命令行使用adb logcat命令时,我没有看到任何这些消息?我看到的只是一条信息,上面写着一个例子。应用程序已经死了。 如何使用adb logcat命令获得Eclipse logcat窗口中显示的相同堆栈跟踪? 编辑

  • 我使用以下代码打印try-catch块中发生的任何异常,但是当异常发生时,logback不会打印完整的堆栈跟踪,而是写入一行错误(它没有明确说明是什么导致了它。我如何在logback输出中打印完整的堆栈跟踪? 尝试捕获异常的catch块 日志返回错误输出:

  • 问题内容: 如何将异常的堆栈跟踪信息打印到stderr以外的流上?我发现的一种方法是使用getStackTrace()并将整个列表打印到流中。 问题答案: 可以接受or或参数: 也就是说,请考虑将SLF4J之类的记录器接口与LOGBack或log4j之类的记录实现一起使用。

  • 问题内容: 有什么方法可以将堆栈跟踪作为字符串获取? 查看调试包(https://golang.org/pkg/runtime/debug/),它只能打印到标准输出。 问题答案: 将格式化的堆栈跟踪放到提供的中。然后,您可以将其转换为字符串。 您还可以使用,分配足够大的缓冲区来容纳整个堆栈跟踪,并使用将该跟踪放入其中,并返回缓冲区()。

  • 问题内容: 将结果转换为描述堆栈跟踪的字符串的最简单方法是什么? 问题答案: 可以使用以下方法将堆栈跟踪转换为。此类可在Apache commons-lang中找到,它是最常见的依赖库,具有许多流行的开源代码

  • 问题内容: 程序中没有单个方法“知道”它在堆栈中的位置。它所知道的只是它自己的小工作,它完成了并返回了。因此,当引发异常并打印堆栈跟踪时,它是从哪里来的? 在JVM中监视程序状态的每个应用程序旁边隐式地运行着一个单独的线程吗?还是JVM本身保存此信息,并且在抛出异常时以某种方式从异常中提取数据? 如果是上述两种情况之一,是否可以使用某些调用来检索堆栈跟踪(从监视器线程或JVM) 而不会 引发异常?