【问题标题】:Logback with prudent mode creates corrupt log file谨慎模式的 Logback 会创建损坏的日志文件
【发布时间】:2020-10-09 08:04:10
【问题描述】:

我们在具有多个 pod 的 kubernetes 集群中运行一个 spring 应用程序作为对一个 tomcat 的战争。所有 pod 都将统计日志文件写入 nfs 共享。所有 pod 都应该写入同一个文件。所以谨慎模式听起来是我们应该使用的东西。

所以我定义了以下 logback appender:

<property name="STATISTIC_LOG_PATTERN" value="%d{yyyy-MM-dd'T'HH:mm:ss:SSSZ},%X{mdc.key1},%X{mdc.key2},%X{mdc.key3},%X{mdc.key4},%X{mdc.key5}, %m %n"/>;

...

<appender name="STATISTIC_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <prudent>true</prudent>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>${statistic.log.path}/statistics_yeti-%d{yyyy-MM-dd}.log</fileNamePattern>
        <maxHistory>30</maxHistory>
    </rollingPolicy>
    <encoder>
        <pattern>${STATISTIC_LOG_PATTERN}</pattern>
    </encoder>
</appender>
....

但生成的日志文件已损坏。有些行不完整,日志文件中有很多 CTRL-@ 特殊字符(nul 提示符)。我找不到有关损坏的 logback 日志文件的任何主题,除了一些建议删除我在配置中没有的文件标签。

据我了解,没有文件标签的文档审慎模式应该足够了吗? Logback 版本是 1.2.3

只有一个 pod 的日志文件是正确的。

【问题讨论】:

  • 我建议记录每个实例并聚合日志(例如到弹性)。 Prudent 在文件写入时创建了排他锁,这会带来巨大的性能成本。

标签: spring kubernetes concurrency logback tomcat8


【解决方案1】:

从v1.2.0开始,safeWrite几乎没用了,看源码就知道了。

OutputStreamAppender.subAppend
protected void subAppend(E event) {
    if (!isStarted()) {
        return;
    }
    try {
        // skip some irrelevant codes...
        byte[] byteArray = this.encoder.encode(event);
        writeBytes(byteArray);
    } catch (IOException ioe) {
        this.started = false;
        addStatus(new ErrorStatus("IO failure in appender", this, ioe));
    }
}

v1.2.0之前的写逻辑是这样的:

try {
    // skip some irrelevant codes...
    writeOut(event)
} catch (IOException ioe) {
    this.started = false;
    addStatus(new ErrorStatus("IO failure in appender", this, ioe));
}

writeOut 被 FileAppender 覆盖

@Override
protected void writeOut(E event) throws IOException {
    if (prudent) {
        safeWrite(event); // here is the point, it ensure write integrity with file lock
    } else {
        super.writeOut(event);
    }
}

此提交于 2017 年 2 月 4 日提交,check this out

现在官方手册里还是有误导的,也许你可以在github repo中提交一个issue

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-04
    • 1970-01-01
    • 2021-11-13
    • 1970-01-01
    • 2018-04-07
    • 2017-01-26
    • 2019-11-05
    • 1970-01-01
    相关资源
    最近更新 更多