How to handle multiline sytem.out.println's in log4j

问题描述 投票:0回答:1

当我在 spring boot 应用程序中启用 ssl 握手日志时,每个 system.out.println 都被记录为 graylog 中的单个条目。我正在寻找一种将多行保持在一起的 Java 解决方案。

javax.net.ssl|DEBUG|EF|http-nio-auto-1-exec-5|2023-03-31 10:28:37.444 CEST|SSLExtensions.java:272|Ignore, context unavailable extension: renegotiation_info
javax.net.ssl|DEBUG|EF|http-nio-auto-1-exec-5|2023-03-31 10:28:37.445 CEST|ClientHello.java:641|Produced ClientHello handshake message (
"ClientHello": {
  "client version"      : "TLSv1.2",
  "random"              : "19F2B67470FA4E573D50B452679D7F794D527517E",
  "session id"          : "0A68F7268E1A29EA4F1AEC6943453D31C9EA02EEC8",
  "cipher suites"       : "[TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384(0xC02C), TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256(0xC02B), TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256(0xCCA9), TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384(0xC030),

只有 javax.net.ssl.... 行应该在 graylog 中记录为单个条目。

我想知道 log4j appender 或 PrintStream(可以分配给 System.setOut(...))是否已经存在,其中可以定义模式,哪些行应该放在一起? Filebeat 是一个选项 (https://www.elastic.co/guide/en/beats/filebeat/current/multiline-examples.html) 但更喜欢可以在 spring boot 应用程序中配置的解决方案。 Logstash 未在使用中。

java spring-boot logging log4j
1个回答
0
投票

为了从 Oracle 的 SSL 实现中捕获调试消息,您需要:

  1. 将其配置为使用适当的日志记录 API 而不是
    System.out
    ,
  2. 使用允许多行消息的日志布局。

重定向 SunJSEE 调试

从 Java 8 开始,如果将

javax.net.debug
变量设置为 字符串,SunJSSE 可以使用适当的日志记录 API,例如与
-Djavax.net.debug=
。实际的日志 API 取决于 Java 版本:

  • Java 8 使用
    java.util.logging
    。您需要
    log4j-jul
    将其转发到 Log4j 2.x API,
  • Java 9 及更高版本使用
    System.Logger
    。您需要
    log4j-jpl
    将其转发到 Log4j 2.x API。或者
    System.Logger
    默认绑定到
    java.util.logging
    .

更改日志布局

要轻松地将 SunJSSE 日志导入 Graylog,您可能需要使用 GELF 布局。您的

log4j2-spring.xml
文件将如下所示:

<Configuration name="app" status="WARN">
  <Appenders>
    <File name="FILE" fileName="${sys:LOG_FILE}">
      <JsonTemplateLayout eventTemplateUri="classpath:GelfLayout.json"/>
    </File>
  </Appenders>
  <Loggers>
    <Root level="INFO">
      <AppenderRef ref="FILE"/>
    </Root>
    <Logger name="javax.net.ssl" level="DEBUG"/>
  </Loggers>
</Configuration>

(为此你需要

log4j-layout-json-template
)。

或者您可以使用 RFC5424 布局 并转义新行:

<Configuration name="app" status="WARN">
  <Appenders>
    <File name="FILE" fileName="${sys:LOG_FILE}">
      <Rfc5424Layout newLine="true" newLineEscape=" "/>
    </File>
  </Appenders>
  <Loggers>
    <Root level="INFO">
      <AppenderRef ref="FILE"/>
    </Root>
    <Logger name="javax.net.ssl" level="DEBUG"/>
  </Loggers>
</Configuration>
© www.soinside.com 2019 - 2024. All rights reserved.