tinylog 2.7.0中如何在任务结束后关闭滚动日志文件?
解决方案
你的问题根源在于:tinylog的滚动文件写入器(RollingFileWriter)在启用dynamic滚动策略时,仅当DynamicSegment的值变更时才会自动滚动日志并关闭旧文件;若无后续任务触发DynamicSegment变更,当前日志文件会一直处于打开状态。
直接调用ProviderRegistry.getLoggingProvider().shutdown()会关闭整个日志系统,导致后续任务无法正常输出日志,因此不可行。正确的做法是单独关闭当前的日志文件句柄,同时保留写入器的可用性,具体实现如下:
代码修改
在任务执行完成后,获取RollingFileWriter实例并调用其close()方法:
import org.tinylog.core.provider.ProviderRegistry; import org.tinylog.core.logging.RollingFileLoggingProvider; import org.tinylog.writers.RollingFileWriter; public void doJob(String pathOFJob) { DynamicSegment.setText(pathOFJob); // 执行任务逻辑 // 任务完成后关闭当前日志文件 var loggingProvider = ProviderRegistry.getLoggingProvider(); if (loggingProvider instanceof RollingFileLoggingProvider) { RollingFileWriter fileWriter = ((RollingFileLoggingProvider) loggingProvider).getWriter(); fileWriter.close(); } }
关键说明
close()方法仅关闭当前打开的日志文件,不会销毁写入器实例。当下一个任务设置新的DynamicSegment并输出日志时,写入器会自动重新初始化文件流,创建/打开新路径下的System.out.log。- 由于你的配置中
writer.tag = -(全局唯一写入器),无需区分多个写入器,直接获取即可。
内容的提问来源于stack exchange,提问作者vfrolov Frolov
相关产品推荐
相关产品推荐

