Как настроить log4j fileappender для всех классов?
В моем приложении я читаю входной файл (например, myFile1.txt) и создаю выходной файл с тем же именем (например, myFile2log). Дело в том, что входной файл будет читаться в приложении Java, а не указываться в качестве параметра командной строки. Поэтому необходимо установить в приложении appender, например
public class Example {
private static final Logger LOG = Logger.getLogger(Example.class);
public Example() throws IOException {
FileAppender appender = new DailyRollingFileAppender(new PatternLayout(
PatternLayout.DEFAULT_CONVERSION_PATTERN), "yourfilename.log",
"'.'yyyy-MM-dd");
LOG.addAppender(appender);
LOG.setLevel((Level) Level.DEBUG);
LOG.debug("blabla");
new RandomClass();
}
public static void main(String[] args) throws IOException {
new Example();
}
}
public class RandomClass {
private static final Logger LOG = Logger.getLogger(RandomClass.class);
public RandomClass() {
LOG.debug("hello Randomclass");
}
}
И вот проблема: если я сделаю вышеописанное, пользовательский файловый аппендер работает только для определенного класса, в котором был определен файловый аппендер, но не для любого другого класса. Поэтому вывод "RandomClass" не будет записан в этот файл журнала, но это то, что требуется. Как я могу этого достичь?
2 ответа
Если вы хотите установить appender динамически, попробуйте установить новый appender в корневой логгер:
Logger logger = Logger.getRootLogger();
FileAppender appender = new DailyRollingFileAppender(new PatternLayout(
PatternLayout.DEFAULT_CONVERSION_PATTERN), "yourfilename.log", "'.'yyyy-MM-dd");
logger.addAppender(appender)
Вы можете использовать файл log4j.properties в вашем пути к классам, тогда вы просто можете инициализировать регистратор во всех классах.
private static final Logger LOG = Logger.getLogger(Example.class);
и Appender все не требуется в конструкторе. Ваш файл свойств должен содержать
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=yourfilename.log
log4j.appender.R.MaxFileSize=2048KB