Logback配置触发多日志文件同时滚动写入异常该如何修复
问题根因
多日志文件并行写入的问题核心由2个配置错误导致:
<FileNamePattern>配置的归档文件名没有和<file>标签的路径保持一致,你<file>用了${LOG_DEST}变量(通常为含路径的完整值,如/app/logs/rtc.log),但归档文件名只写了rtc.log.%i相对路径,logback滚动时路径匹配逻辑异常,会重复打开历史归档文件写入。- 配置中
<Append>标签首字母大写不符合logback规范,logback配置属性采用驼峰命名,大写的<Append>会被识别为无效配置,可能触发文件句柄未正常释放的异常。
修复方案
调整logback滚动配置如下:
<appender name="rtc_file_appender" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_DEST}</file> <!-- 修正为符合规范的小写append属性 --> <append>true</append> <encoder> <Pattern>%date | [%.-1level] | %logger | %X{threadId} | %msg%n</Pattern> </encoder> <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> <maxIndex>5</maxIndex> <!-- 归档文件名和<file>路径保持统一,确保路径匹配逻辑正常 --> <FileNamePattern>${LOG_DEST}.%i</FileNamePattern> </rollingPolicy> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <MaxFileSize>5MB</MaxFileSize> </triggeringPolicy> <!-- 高并发场景可开启prudent安全写入模式,避免文件冲突 --> <prudent>true</prudent> </appender>
调整说明
- 归档文件名前缀和
<file>配置保持一致,确保logback滚动时可以正确识别当前活跃日志文件和归档文件的对应关系,不会误打开历史归档文件写入 - 修正
append属性的大小写,保证追加配置生效,滚动时旧文件句柄会被正常释放 - 新增
prudent属性开启安全写入模式,适配多线程高并发写日志的场景,彻底避免多文件句柄共存的问题
内容的提问来源于stack exchange,提问作者sheik
相关产品推荐
相关产品推荐

