2015-11-26 2 views
2

Я использую Log4j в проекте, который перенаправляет его журналы на несколько разных файлов в зависимости от пакета, в котором находится вызывающий класс. Однако в моем проекте есть классы использования, которые используются во всем проекте, и я бы как и их журналы для добавления в соответствующий журнал в зависимости от вызывающего класса. В случае ошибок я могу генерировать исключения, но в случае предупреждений это не очень хорошая идея. Есть ли способ сделать «перенаправление» журналов классов util в зависимости от вызывающего класса?Log4j log вызывающий класс

ответ

0

Вы можете использовать стек, чтобы получить вызывающего абонента (см. How do I find the caller of a method using stacktrace or reflection?), но это, вероятно, ухудшит производительность вашего приложения.

Другим вариантом было бы использовать локальное хранилище потоков для установки текущего используемого регистратора, но, опять же, это немного излишний, по моему мнению.

Я не знаю ни одной «стандартной» способ сделать это ...

0

Я хотел бы предложить вам пару решения:

  1. первым должен регистрировать все сообщения в тот же файл, но префикс их по-разному в зависимости от контекста, поэтому его можно легко фильтровать. Один способ фильтрации - использовать org.apache.log4j.NDC.

  2. Во-вторых, попробуйте что-то вроде this. Это имеет простое решение для входа вывода определенного класса к определенному Appender :-)

0

Если ваш проект не большой и рефакторинг не будет большой проблемой, я бы избавиться от статических методов , Таким образом, вы можете использовать инъекции передать Logger классу полезности везде, где вам это нужно:

public class MyUtils { 
    private final Logger logger; 

    public MyUtils (Logger logger) { 
    this.logger = logger; 
    } 

    public void doSomething(...) { 
    // use the logger 
    } 
} 

Тогда вы бы создать экземпляр класса утилиты в верхнем наиболее родительском классе (ов) и использовать тот же служебный класс в дочерние классы; что-то вроде

public abstract class BaseClass { 

    // You can use log4j to log in different files; 
    // e.g. you would probably want all child classes of BaseClass to use the same log 
    private static final Logger LOGGER = Logger.getLogger("some_log"); 

    // Doesn't have to be static, but one instance would be enough in this case 
    private static final MyUtils UTILS = new MyUtils(LOGGER); 

} 

Тогда в классе ребенка вы бы использовать класс утилиты вроде этого:

getUtils().doSomething(); 
Смежные вопросы