log4j: выходной файл в зависимости от класса вызова источника - PullRequest
5 голосов
/ 25 июня 2010

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

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

Ответы [ 3 ]

3 голосов
/ 25 июня 2010

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

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

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

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;
  }
}
1 голос
/ 25 июня 2010

Как насчет записи чего-то подобного в вашем 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 ИНФОРМАЦИЯ фон: выполнение вычислений ...

в main.log: 2010-06-25 14: 23: 35,495 ИНФОРМАЦИЯ основное: выполнение вычислений ...

0 голосов
/ 25 июня 2010

Я бы предложил использовать наследование и не объявлять окончательные поля.

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...