log4j不使用配置文件进行配置,并动态设置日志文件路径

使用到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();
    }

}

猜你喜欢

转载自blog.csdn.net/hexiaodiao/article/details/102414014