英文:
JSON Layout with Pattern in Logback Java
问题
我在我的Spring Boot应用程序中使用logback进行日志记录,并使用以下模式:
"%d [%thread] %-5p [%c] [%F:%L] [trace=%X{X-B3-TraceId:-},span=%X{X-B3-SpanId:-}] - %msg%n"
现在我想要切换到JSON布局以进行日志记录。但是我没有找到一种将该模式应用于我的日志的方法,因此会丢失上述许多信息。
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<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>
</appender>
是否有其他方法可以实现相同的效果呢?
英文:
I am using logback for logging in my spring boot application and using the pattern as per:
"%d [%thread] %-5p [%c] [%F:%L] [trace=%X{X-B3-TraceId:-},span=%X{X-B3-SpanId:-}] - %msg%n"
Now I want to move to the JSON layout for my logs. But I don't see a way to apply the pattern to my logs as a result many of the above information is lost.
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<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>
</appender>
Any alternative way to achieve the same?
答案1
得分: 7
我在实现`JsonLayout`后遇到了相同的问题,在我的`logback-spring.xml`中,我意识到我不能使用自定义模式。
在经过大量搜索和浪费了几个小时后,我发现了另一种类型的logAppender,它允许指定模式并以Json格式打印日志。
您需要使用`net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder`编码器,而不是使用`JsonLayout`。
示例如下:
<encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers>
<timestamp>
<fieldName>timestamp</fieldName>
<pattern>yyyy-MM-dd' 'HH:mm:ss.SSS</pattern>
</timestamp>
<pattern>您所需的模式</pattern>
</providers>
</encoder>
编辑:
有关详细文档,您还可以查看这个GitHub链接:
<details>
<summary>英文:</summary>
I have came across the same problem after implementing the `JsonLayout` in my `logback-spring.xml` I realized I cannot put in my own custom pattern.
Well after googling a lot and wasting few hours I came across 1 more kind of logAppender which allows pattern and also print logs in Json format.
You need to use `net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder` encoder instead of `JsonLayout`
The sample implementation can be as follows:
<encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers>
<timestamp>
<fieldName>timestamp</fieldName>
<pattern>yyyy-MM-dd' 'HH:mm:ss.SSS</pattern>
</timestamp>
<pattern> your desired pattern </pattern>
</providers>
</encoder>
Edit:
For in-details documentation you can also check the this [github link:][1]
[1]: https://github.com/logstash/logstash-logback-encoder#providers-for-loggingevents
</details>
# 答案2
**得分**: 0
你在lagback.xml中<appender>和<layout>之间丢失了<encoder>。
<jsonFormatter class="ch.qos.logback.contrib.jackson.JacksonJsonFormatter">
<prettyPrint>true</prettyPrint>
</jsonFormatter>
</layout>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="stdout"/>
</root>
```
英文:
you lose the <encoder> between <appender> and <layout> in you lagback.xml
<configuration debug="true">
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
***<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.SSSZZ</timestampFormat>
<timestampFormatTimezoneId>Etc/UTC</timestampFormatTimezoneId>
<jsonFormatter class="ch.qos.logback.contrib.jackson.JacksonJsonFormatter">
<prettyPrint>true</prettyPrint>
</jsonFormatter>
</layout>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="stdout"/>
</root>
</configuration>
答案3
得分: 0
从logback 1.3.8/1.4.8版本开始,内置支持JSON,因此您只需更改配置即可。
因此,您的配置文件 logback-spring.xml
将如下所示:
<configuration>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.JsonEncoder"/>
</appender>
<root>
<level value="DEBUG"/>
<appender-ref ref="CONSOLE"/>
</root>
</configuration>
然后,您将在控制台上获得JSON输出。
英文:
As of logback 1.3.8/1.4.8 there is built in support for JSON https://logback.qos.ch/manual/encoders.html#JsonEncoder so you can just change the config
So you config file logback-spring.xml
would look like
<configuration>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.JsonEncoder"/>
</appender>
<root>
<level value="DEBUG"/>
<appender-ref ref="CONSOLE"/>
</root>
</configuration>
Then you will get JSON output to the console
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论