我在 Logback 中使用滚动文件附加器和非常基本的编码器模式来登录 JSON。该应用程序是用 Java 编写的。我知道有一些适用于 Java 的 Logback JSON 包,但我决定不使用它们,因此我不必在代码中引入任何新的依赖项。
我已经让以下附加程序工作了。它以 Filebeat 和 Logstash 可以读取的 JSON 格式输出日志。
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/opt/tomcat/logs/LOG.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- rollover daily -->
<fileNamePattern>/opt/tomcat/logs/LOG.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- or whenever the file size reaches 100MB -->
<maxFileSize>200MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>30</maxHistory>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder>
<pattern>
{"@timestamp": "%d{ISO8601}", "date": "%d{dd-MM-yy}", "thread": "%thread", "level": "%-5level", "className": "%logger{36}", "message": "%replace(%replace(%msg){'\n','\u2028'}){'\t',' '} %replace(%replace(%ex){'\n','\u2028'}){'\t',' '}" }%nopex%n
</pattern>
</encoder>
</appender>
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,该行的缩进{"@timestamp": "%d{ISO8601}",....
已关闭(如果我缩进它,它会在日志文件本身中缩进),并且该行对于任何 Checkstyle 验证(和可读性)来说都太长了。我更愿意这样写:
<encoder>
<pattern>
{
"@timestamp": "%d{ISO8601}",
"date": "%d{dd-MM-yy}",
...
}%nopex%n
</pattern>
</encoder>
Run Code Online (Sandbox Code Playgroud)
关于如何让 XML 和/或 Logback 忽略此模式的格式并只是吐出文本,有什么想法吗?
下面创建了一个保存模式的属性,因此也许它允许您根据需要设置其格式:
例子:
<property name="ENCODER_PATTERN"
value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{80} - %msg%n" />
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${ENCODER_PATTERN}</pattern>
</encoder>
Run Code Online (Sandbox Code Playgroud)