使用 Logback 的日志中不可读的线程名称
Posted
技术标签:
【中文标题】使用 Logback 的日志中不可读的线程名称【英文标题】:Unreadable thread name in logs with Logback 【发布时间】:2020-10-26 07:02:42 【问题描述】:我运行 Spring Boot 应用程序并具有以下 logback-spring.xml 文件:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="LOGS" value="./logs" />
<appender name="Console"
class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>
%black(%dISO8601) %highlight(%-5level) [%blue(%t)] %yellow(%C1.): %msg%n%throwable
</Pattern>
</layout>
</appender>
<appender name="RollingFile"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>$LOGS/logger.log</file>
<encoder
class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<charset>UTF-8</charset>
<Pattern>%d %p %C1. [%t] %m%n</Pattern>
</encoder>
<rollingPolicy
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- rollover daily and when the file reaches 10 MegaBytes -->
<fileNamePattern>$LOGS/archived/logger-%dyyyy-MM-dd.%i.log
</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
<!-- LOG everything at INFO level -->
<root level="info">
<appender-ref ref="RollingFile" />
<appender-ref ref="Console" />
</root>
</configuration>
默认 Spring Boot 日志可以正常工作:
2020-07-06 10:24:02,276 INFO [restartedMain] org.springframework.boot.SpringApplication: No active profile set, falling back to default profiles: default
但是当应用尝试记录传入信息时,我会得到:
2020-07-06 10:24:24,604 INFO [Áèáëèîòåêà èãð Google Play Telegram Executor] ru.miroha.bot.GooglePlayGameBot: Hello, Test!
在控制台和文件中相同。
Google Play Telegram Executor
是合法的,但 Áèáëèîòåêà èãð
是什么?
如果我删除此 logback.xml 配置并使用默认 Spring Bot 记录器运行,则此消息将如下所示:
2020-07-06 10:22:00.418 INFO 6796 --- [legram Executor] ru.miroha.bot.GooglePlayGameBot : Hello!
怎么了?
【问题讨论】:
【参考方案1】:编码文本来自您配置中的%C1.
。也许你的对象的调用者故意混淆了类名?类是否从库中调用该行?
您是否需要与%C0
相比,您想要记录的呼叫者记录的深度?
关于来电记录的更多信息: http://logback.qos.ch/manual/layouts.html
【讨论】:
似乎它甚至不是错误的 logback 配置。我刚刚用java.lang.Thread
检查了线程名称,它返回了Áèáëèîòåêà èãð Google Play Telegram Executor
。很有趣。
是的,您在 Pattern 中拥有的 %C
正在记录调用者,其中一个调用者类包含未正确解码的文本。配置是有效的,但只是堆栈上的调用者不会显示您想要的方式。【参考方案2】:
我发现了真正的问题。此线程名称包含我的电报机器人名称(我猜是 api 功能),并且此 api 无法正确处理西里尔字母。
【讨论】:
以上是关于使用 Logback 的日志中不可读的线程名称的主要内容,如果未能解决你的问题,请参考以下文章