如何在log4j中处理多行system.out.println

eoigrqb6  于 2023-04-06  发布在  其他
关注(0)|答案(1)|浏览(155)

当我在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未使用。

7fhtutme

7fhtutme1#

要从Oracle的SSL实现捕获调试消息,您需要:
1.将其配置为使用适当的日志API而不是System.out
1.使用允许多行消息的日志记录布局。

重定向SunJSEE调试

从Java 8开始,如果你将javax.net.debug变量设置为一个字符串,例如使用-Djavax.net.debug=,SunJSSE可以使用一个正确的日志API。实际的日志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>

(you 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>

相关问题