Я использую Log4j в проекте, который перенаправляет его журналы на несколько разных файлов в зависимости от пакета, в котором находится вызывающий класс. Однако в моем проекте есть классы использования, которые используются во всем проекте, и я бы как и их журналы для добавления в соответствующий журнал в зависимости от вызывающего класса. В случае ошибок я могу генерировать исключения, но в случае предупреждений это не очень хорошая идея. Есть ли способ сделать «перенаправление» журналов классов util в зависимости от вызывающего класса?Log4j log вызывающий класс
ответ
Вы можете использовать стек, чтобы получить вызывающего абонента (см. How do I find the caller of a method using stacktrace or reflection?), но это, вероятно, ухудшит производительность вашего приложения.
Другим вариантом было бы использовать локальное хранилище потоков для установки текущего используемого регистратора, но, опять же, это немного излишний, по моему мнению.
Я не знаю ни одной «стандартной» способ сделать это ...
Я хотел бы предложить вам пару решения:
первым должен регистрировать все сообщения в тот же файл, но префикс их по-разному в зависимости от контекста, поэтому его можно легко фильтровать. Один способ фильтрации - использовать org.apache.log4j.NDC.
Во-вторых, попробуйте что-то вроде this. Это имеет простое решение для входа вывода определенного класса к определенному Appender :-)
Если ваш проект не большой и рефакторинг не будет большой проблемой, я бы избавиться от статических методов , Таким образом, вы можете использовать инъекции передать 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();
- 1. log4j log log во время инициализации log4j
- 2. Log4j Log Aggregators?
- 3. Log4j gc log rotation
- 4. Log4J Log Rotation
- 5. Log4J log on year folder
- 6. log4j log файлы не найдены
- 7. log4j set default log directory
- 8. Где был выход Log4j Log Output?
- 9. Исключить класс от log4j Appender
- 10. Log4j 2 журнала записываются в log log файл
- 11. Как писать только журналы INFO в log log log4j?
- 12. Log4j - log ВСЕ уровни, кроме ОШИБКИ
- 13. Apppend log message в начале файла log4j
- 14. log Файл не генерируется в log4j
- 15. jboss eap 6.2 log using log4j
- 16. Wildfly Log Viewer должен показывать log4j logs
- 17. Как удалить столбцы из Log4j HTML Log
- 18. Как узнать вызывающий класс?
- 19. Extjs вызывающий класс объекта
- 20. Оператор switch, вызывающий класс void
- 21. Log4j неправильный класс с использованием Spring AOP
- 22. PHP вызывающий класс от другого класса
- 23. Хранение входа в .log-файл с использованием SLF4j/log4j
- 24. Android Intent не вызывающий класс
- 25. Установить делегат как вызывающий класс
- 26. вызывающий класс с пользовательским вводом
- 27. C# ArrayList, вызывающий класс конструктора
- 28. Builder C++, вызывающий класс VC++
- 29. Итерация через класс, вызывающий проблемы
- 30. вызывающий класс от веб-сервиса