使用 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 的日志中不可读的线程名称的主要内容,如果未能解决你的问题,请参考以下文章

使用logstash结合logback收集微服务日志

使用logback.xml配置来实现日志文件输出

使用 Logback 隐患:日志必不可少,打日志姿势不能出错...

LogBack入门实践

如何把工程名称写到logback日志中

小技巧:如何自定义logback日志文件的名称