如何配置Log4j仅在有日志输出时创建日志文件?
解决Log4J空日志文件自动创建的问题
这个问题我之前碰到过好几次,本质是Log4J默认的FileAppender(包括它的子类比如RollingFileAppender)在初始化阶段就会创建日志文件,不管后续有没有实际的日志事件需要写入。下面分版本给你说具体的解决办法:
Log4j 2.x 版本(优先推荐,配置更灵活)
如果用的是Log4j 2.x,那解决起来特别简单——只需要在你的log4j2.properties(或者xml/yaml配置文件)里给FileAppender加上createOnDemand="true"属性就行。
给你一个properties格式的配置示例:
# 定义Appender appenders = file appender.file.type = File appender.file.name = FileAppender appender.file.fileName = log.log appender.file.createOnDemand = true # 这行是关键!开启后只有有日志时才创建文件 appender.file.layout.type = PatternLayout appender.file.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n # 配置根Logger rootLogger.level = info rootLogger.appenderRefs = file rootLogger.appenderRef.file.ref = FileAppender
这样配置后,只有当第一条符合级别要求的日志被打印时,log.log才会被创建;如果全程没有日志输出,就不会生成空文件。
Log4j 1.x 版本(旧版本兼容方案)
Log4j 1.x本身没有内置的“按需创建”配置项,不过可以通过两种方式解决:
方法1:动态初始化Appender
不在配置文件里提前配置FileAppender,而是在代码里判断需要打印日志时,再动态添加Appender。示例代码如下:
import org.apache.log4j.Logger; import org.apache.log4j.FileAppender; import org.apache.log4j.PatternLayout; public class HelloWorld { private static final Logger logger = Logger.getLogger(HelloWorld.class); private static boolean appenderInitialized = false; public static void main(String[] args) { // 只有当当前日志级别允许输出时,才初始化Appender if (logger.isInfoEnabled()) { initFileAppenderIfNeeded(); logger.info("Hello World"); } // 如果没有日志代码,这里不会执行初始化,自然不会创建文件 } private static void initFileAppenderIfNeeded() { if (!appenderInitialized) { try { FileAppender appender = new FileAppender( new PatternLayout("%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n"), "log.log" ); logger.addAppender(appender); appenderInitialized = true; } catch (Exception e) { e.printStackTrace(); } } } }
方法2:用Filter结合NullAppender兜底
这种方式稍显繁琐,就是默认用NullAppender(不创建文件也不输出日志),然后给FileAppender加ThresholdFilter,只有当达到指定日志级别时才激活。不过相比动态初始化,这种配置比较绕,一般更推荐第一种代码方式。
内容的提问来源于stack exchange,提问作者S.Dan
相关产品推荐
相关产品推荐

