предположите, что у меня есть общий класс с регистратором, инициализированным его именем:
public class SomeCalculationLogic {
private static final Log log = LogFactory.getLog(SomeCalculationLogic .class);
public void doCalculation() {
log.info("doing calculations...");
...
}
}
Этот класс используется двумя логически различными потоками - говорят, что это называют от классов "BackgroundTask" и "UserRequest". Как сделать вывод регистратора SomeCalculationLogic перенаправленным к различным файлам журнала (как background.log и main.log) в зависимости от того, каков вызов класса?
Я вижу три возможных пути:
Рабочая реализация решения для создания подклассов будет примерно такой:
public class SomeCalculationLogic {
protected abstract Log getLog();
public void doCalculation() {
getLog().info("doing calculations...");
...
}
}
public class BackgroundCalculationLogic extends SomeCalculationLogic {
private static Log log = LogFactory.getLog(BackgroundCalculationLogic.class);
protected Log getLog() {
return log;
}
}
public class UserRequestCalculationLogic extends SomeCalculationLogic {
private static Log log = LogFactory.getLog(UserRequestCalculationLogic.class);
protected Log getLog() {
return log;
}
}
Как насчет того, чтобы написать что-то вроде этого в вашем log4j.xml
<appender name="main-logfile" class="org.apache.log4j.RollingFileAppender">
<param name="file" value="${user.home}/.logs/main.log"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="conversionPattern" value="%d %-5p %c{1}: %m%n"/>
</layout>
</appender>
<logger name="com.calculationlogic.main" additivity="false">
<appender-ref ref="main-logfile"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="conversionPattern" value="%d %-5p %c{1}: %m%n"/>
</layout>
</logger>
<appender name="background-logfile" class="org.apache.log4j.RollingFileAppender">
<param name="file" value="${user.home}/.logs/background.log"/>
</appender>
<logger name="com.calculationlogic.background" additivity="false">
<appender-ref ref="background-logfile"/>
</logger>
и затем java-часть:
public class SomeCalculationLogic {
private final Category logger;
public SomeCalculationLogic(final Category logger){
this.logger = logger;
}
public void doCalculation() {
log.info("doing calculations...");
}
}
public class BackgroundTask{
public BackgroundTask(){
new SomeCalculationLogic(Logger.getLogger("com.calculationlogic.background")).doCalculation()
}
}
public class MainTask{
public MainTask(){
new SomeCalculationLogic(Logger.getLogger("com.calculationlogic.main")).doCalculation()
}
}
Результат: в background.log: 2010-06-25 14:23:35,496 INFO background: doing calculations...
в main.log: 2010-06-25 14:23:35,495 INFO main: doing calculations...
Я бы посоветовал использовать наследование, а не объявлять поля final.
public class SomeCalculationLogic {
private static Log log = LogFactory.getLog(SomeCalculationLogic .class);
public void doCalculation() {
log.info("doing calculations...");
...
}
}
public class BackgroundCalculationLogic {
private static Log log = LogFactory.getLog(BackgroundCalculationLogic .class);
}
public class UserRequestCalculationLogic {
private static Log log = LogFactory.getLog(UserRequestCalculationLogic .class);
}