log4j: выходной файл в зависимости от исходного класса вызова

предположите, что у меня есть общий класс с регистратором, инициализированным его именем:

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) в зависимости от того, каков вызов класса?

5
задан skaffman 25 June 2010 в 08:52
поделиться

3 ответа

Я вижу три возможных пути:

  • если этого достаточно чтобы записывать все сообщения в один и тот же файл, но с разными префиксами в зависимости от контекста, чтобы их можно было легко фильтровать, вы можете использовать вложенный диагностический контекст , как описано в , мой предыдущий ответ ],
  • , если вам абсолютно необходимы отдельные файлы журнала, вы можете создать подкласс своего класса с двумя разными регистраторами и связанными дополнениями, как предложил Ксавьер (только его решения, к сожалению, не работают как есть),
  • или попробуйте это альтернативное решение .

Рабочая реализация решения для создания подклассов будет примерно такой:

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;
  }
}
3
ответ дан 15 December 2019 в 00:50
поделиться

Как насчет того, чтобы написать что-то вроде этого в вашем 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...

1
ответ дан 15 December 2019 в 00:50
поделиться

Я бы посоветовал использовать наследование, а не объявлять поля 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);
}
0
ответ дан 15 December 2019 в 00:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: