Dav*_*vid 6 logging logback spring-boot logz.io spring-logback
使用spring boot 2.1.1.RELEASE
可以通过提供logback-spring.xml
如下文件将日志格式化为JSON :
<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.SSSX</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>
Run Code Online (Sandbox Code Playgroud)
并添加到 pom.xml
<dependency>
<groupId>ch.qos.logback.contrib</groupId>
<artifactId>logback-json-classic</artifactId>
<version>0.1.5</version>
</dependency>
<dependency>
<groupId>ch.qos.logback.contrib</groupId>
<artifactId>logback-jackson</artifactId>
<version>0.1.5</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
确实导致了如下消息:
{
"timestamp" : "2018-12-11T18:20:25.641Z",
"level" : "INFO",
"thread" : "main",
"logger" : "com.netflix.config.sources.URLConfigurationSource",
"message" : "To enable URLs as dynamic configuration sources, define System property archaius.configurationSource.additionalUrls or make config.properties available on classpath.",
"context" : "default"
}
Run Code Online (Sandbox Code Playgroud)
我正在试用logz.io,当日志以JSON格式格式化时,它似乎表现得更好,某些运货人在处理多行日志时遇到了麻烦,就像我们在Java堆栈跟踪中看到的那样;当以JSON格式格式化时,它可以自动解析诸如level
和message
,它会自动获取MDC数据。
对于将日志传送到logzio的几种方法,我有一些不太好的经验,例如他们的docker映像和使用rsyslog而不使用JSON格式的日志消息。
它的工作原理确定控制台追加,但春天的引导提供了像logging.file=test.log
,logging.level.com.example=WARN
,logging.pattern.console
。我确实可以导入托管配置spring-boot-2.1.1.RELEASE.jar!/org/springframework/boot/logging/logback/base.xml
,然后从托管配置中导入console-appender.xml and
file-appender.xml`。
<included>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
</appender>
</included>
Run Code Online (Sandbox Code Playgroud)
<included>
<appender name="FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
<file>${LOG_FILE}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz</fileNamePattern>
<maxFileSize>${LOG_FILE_MAX_SIZE:-10MB}</maxFileSize>
<maxHistory>${LOG_FILE_MAX_HISTORY:-0}</maxHistory>
</rollingPolicy>
</appender>
</included>
Run Code Online (Sandbox Code Playgroud)
这两个正是我支持属性的spring配置所需要的,但是它们不包括我需要的编码器/布局。
在我的初始测试中,我似乎无法简单地将自己的附加程序命名为相同的附加程序并提供布局。例如:
<configuration>
<include resource="org/springframework/boot/logging/logback/base.xml"/>
<appender name="CONSOLE" 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.SSSX</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="CONSOLE" />
</root>
</configuration>
Run Code Online (Sandbox Code Playgroud)
导致消息以JSON和纯文本格式记录。
实际上,我确实可以将这3个文件的内容复制并粘贴到我的自定义配置中,而不是完全导入它们。然后,我可以覆盖我要自定义的内容。
但是,随着春天的发展和可能会增加功能的新发行版的出现,我将永远强迫自己保持,复制和粘贴新文件并进行更改和测试。
有什么更好的办法吗?
脚注:logzio确实提供了可以导入的依赖项,但是我不喜欢将日志记录提供程序直接耦合到代码中的想法。我觉得,如果伺服器恰巧将JSON日志生成到stdout或文件中,那么任何提供程序都可以轻松地处理这些日志并将其发送到某个目的地。
Ahm*_*gaç 21
我没有使用任何依赖项。简单地说,通过 application.yml 完成,仅此而已。此解决方案也解决了多行日志问题。
logging:
pattern:
console: "{\"time\": \"%d\", \"level\": \"%p\", \"correlation-id\": \"%X{X-Correlation-Id}\", \"source\": \"%logger{63}:%L\", \"message\": \"%replace(%m%wEx{6}){'[\r\n]+', '\\n'}%nopex\"}%n"
Run Code Online (Sandbox Code Playgroud)
我使用类似下面的东西,一直工作得很好。
Spring Boot 建议命名该文件logback-spring.xml
并将其放在 下src/main/resources/
,这使我们能够在 logback 中使用 spring 配置文件。因此,在下面的文件中,您将看到,对于LOCAL
配置文件,您可以以标准方式登录,但对于服务器或容器上的部署,您可以使用不同的日志记录策略。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %5p [YourApp:%thread:%X{X-B3-TraceId}:%X{X-B3-SpanId}] %logger{40} - %msg%n
</pattern>
</encoder>
</appender>
<appender name="jsonstdout" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
<providers>
<timestamp>
<timeZone>EST</timeZone>
</timestamp>
<pattern>
<pattern>
{
"level": "%level",
"service": "YourApp",
"traceId": "%X{X-B3-TraceId:-}",
"spanId": "%X{X-B3-SpanId:-}",
"thread": "%thread",
"class": "%logger{40}",
"message": "%message"
}
</pattern>
</pattern>
<stackTrace>
<throwableConverter class="net.logstash.logback.stacktrace.ShortenedThrowableConverter">
<maxDepthPerThrowable>30</maxDepthPerThrowable>
<maxLength>2048</maxLength>
<shortenedClassNameLength>20</shortenedClassNameLength>
<rootCauseFirst>true</rootCauseFirst>
</throwableConverter>
</stackTrace>
</providers>
</encoder>
</appender>
<root level="info">
<springProfile name="LOCAL">
<appender-ref ref="stdout" />
</springProfile>
<springProfile name="!LOCAL">
<appender-ref ref="jsonstdout" />
</springProfile>
</root>
</configuration>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2965 次 |
最近记录: |