我的任务是尝试实现一种结构化的方式来记录工作中的事物。我在logback和log4j2之间来回尝试,以满足我对日志记录的某些要求。我决定使用logback,因为它更易于传递键值映射并将其以json格式显示为日志的一部分。但是,与log4j2不同,我无法通过logback将输出打印到格式正确的json文件中。
我尝试了两个使用不同依赖项的附加程序来实现我的目标:JacksonJsonFormatter和Logstash LoggingEventCompositeJsonLayout。我还尝试谷歌搜索我的问题,然后单击前两个Google页面上的链接,而没有任何与我的问题相关的解决方案。这是两个不同的附加程序:
使用杰克逊:
<appender name="test" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="ch.qos.logback.contrib.json.classic.JsonLayout">
<timestampFormat>yyyy-MM-dd'T'HH:mm:ss.SSSX</timestampFormat>
<timestampFormatTimezoneId>Etc/UTC</timestampFormatTimezoneId>
<jsonFormatter class="ch.qos.logback.contrib.jackson.JacksonJsonFormatter">
<prettyPrint>true</prettyPrint>
</jsonFormatter>
</layout>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>info</level>
</filter>
<file>./logs/info.log.json</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.json</fileNamePattern>
<maxFileSize>100MB</maxFileSize>
<maxHistory>60</maxHistory>
<totalSizeCap>20GB</totalSizeCap>
</rollingPolicy>
</appender>
使用logstash:
<appender name="stash" class="ch.qos.logback.core.rolling.RollingFileAppender">
<layout class="net.logstash.logback.layout.LoggingEventCompositeJsonLayout">
<providers>
<message/>
<loggerName/>
<threadName/>
<logLevel/>
<logLevelValue/>
<callerData/>
<stackTrace/>
<stackHash/>
<throwableClassName/>
<context/>
<contextName/>
<mdc/>
</providers>
</layout>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>info</level>
</filter>
<file>./logs/info.log.json</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.json</fileNamePattern>
<maxFileSize>100MB</maxFileSize>
<maxHistory>60</maxHistory>
<totalSizeCap>20GB</totalSizeCap>
</rollingPolicy>
</appender>
我想要作为输出的是一个格式正确的json文件,这意味着如果我记录3个事件,事情将像这样(出于可读性的考虑,我简化了格式)。
预期:
[
{
"message": "hello",
"context": "default"
},
{
"message": "hi",
"context": "default"
},
{
"message": "how are you",
"context": "default"
}
]
实际记录数:
{ "message": "hello", "context": "default"}{"message": "hi", "context": "default"} {"message": "how are you", "context": "default"}
实际杰克逊:
{
"message": "hello",
"context": "default"
}{
"message": "hi",
"context": "default"
}{
"message": "how are you",
"context": "default"
}
请注意,记录的事件之间没有逗号,并且事件本身也不是数组的一部分。杰克逊可以进行漂亮的打印,而日志存储则将所有内容放在同一行。这意味着该文件不是json有效,除其他外,在我的IDE中读取该文件时无法对其进行自动格式化。
有人能解决这个问题吗?