使用到log4j的项目打成jar之后在别的项目使用却不生成日志.这里使用代码进行配置log4j确保日志配置存在且生效.
这里困扰的问题就是重新设置日志目录之后不生效.还是得跟进源码去看.日志最后是以流的方式写出到文件,然后呢,他文件路径更新并不会直接重新修改文件流,这里需要使用一个activeOptions的方法刷新流.所有继承自FileAppender的都有这个哦,FileAppender的上一级父类WriterAppender因为并不是使用的文件而是writer所以activeOptions方法没有做任何实现.文档注释上也写着Does nothing.
/**
* If the value of <b>File</b> is not <code>null</code>, then {@link
* #setFile} is called with the values of <b>File</b> and
* <b>Append</b> properties.
*
* @since 0.8.1
*/
public void activateOptions() {
if (fileName != null) {
try {
setFile(fileName, fileAppend, bufferedIO, bufferSize);
} catch (java.io.IOException e) {
errorHandler.error("setFile(" + fileName + "," + fileAppend + ") call failed.",
e, ErrorCode.FILE_OPEN_FAILURE);
}
} else {
//LogLog.error("File option not set for appender ["+name+"].");
LogLog.warn("File option not set for appender [" + name + "].");
LogLog.warn("Are you using FileAppender instead of ConsoleAppender?");
}
}
直接上一波代码,自取.
package com.relic.log;
import org.apache.log4j.*;
/**
* @author Relic
* @desc 日志测试
* @date 2019-10-08 15:34
*/
public class LogTest {
private static final RollingFileAppender FILE_APPENDER = new RollingFileAppender();
private static final Logger rootLogger = Logger.getRootLogger();
private static final String DEFAULT_LOG_PATH = "D:\\tmp\\all.log";
private static final String DEBUG = "debug";
private static final String WARN = "warn";
private static final String ERROR = "error";
private static Logger logger = Logger.getLogger(LogTest.class);
static {
FILE_APPENDER.setFile(DEFAULT_LOG_PATH);
FILE_APPENDER.setMaxBackupIndex(5);
FILE_APPENDER.setMaxFileSize("50MB");
FILE_APPENDER.setAppend(true);
FILE_APPENDER.setLayout(new PatternLayout(PatternLayout.TTCC_CONVERSION_PATTERN));
FILE_APPENDER.activateOptions();
rootLogger.setLevel(Level.INFO);
rootLogger.addAppender(new ConsoleAppender(new PatternLayout(PatternLayout.TTCC_CONVERSION_PATTERN)));
rootLogger.addAppender(FILE_APPENDER);
}
public void log() {
logger.info("test");
}
public void setMaxFileSize(String fileSize) {
FILE_APPENDER.setMaxFileSize(fileSize);
}
public void setMaxBackupIndex(Integer index) {
FILE_APPENDER.setMaxBackupIndex(index);
}
public void setLevel(String level) {
Level logLevel = Level.INFO;
if (DEBUG.equalsIgnoreCase(level)) {
logLevel = Level.DEBUG;
}
if (WARN.equalsIgnoreCase(level)) {
logLevel = Level.WARN;
}
if (ERROR.equalsIgnoreCase(level)) {
logLevel = Level.ERROR;
}
rootLogger.setLevel(logLevel);
}
public void setLogPath(String path) {
FILE_APPENDER.setFile(path);
FILE_APPENDER.activateOptions();
}
}