Я пытаюсь использовать SLF4J (с log4j
привязкой) в первый раз.
Я хотел бы настроить 3 разных именованных регистратора, которые могут быть возвращены LoggerFactory, который будет регистрировать разные уровни и отправлять сообщения разным приложениям:
- Logger 1 "FileLogger" регистрирует отладку и добавляет к
DailyRollingFileAppender
- Logger 2 "TracingLogger" регистрирует TRACE + и добавляет к
JmsAppender
- Logger 3 «ErrorLogger» регистрирует ОШИБКУ + и добавляет к другому
JmsAppender
Кроме того, я хочу, чтобы они были настроены программно (в Java, в отличие от XML или log4j.properties
файла).
Я предполагаю, что обычно я определяю их Logger
где-то в некотором загрузочном коде, например, в init()
методе. Однако из-за того, что я хочу использовать slf4j-log4j
, я не понимаю, где я могу определить регистраторы и сделать их доступными для пути к классам.
Я не верю, что это является нарушением основной цели SLF4J (как фасад), потому что мой код, использующий API SLF4J, никогда не узнает о существовании этих регистраторов. Мой код просто выполняет обычные вызовы API SLF4J, который затем перенаправляет их в Log4j Loggers, которые он находит на пути к классам.
Но как мне настроить эти log4j Logger на пути к классам ... в Java ?!
Ответы:
Вы можете добавить / удалить Appender программно в Log4j:
Я бы посоветовал вам поместить его в init () где-нибудь, где вы уверены, что это будет выполнено раньше всего. Затем вы можете удалить все существующие приложения в корневом логгере с помощью
и начните с добавления своего. Вам нужно log4j в classpath, конечно, чтобы это работало.
Замечание:
Вы можете взять все, что
Logger.getLogger(...)
захотите, чтобы добавить дополнения. Я просто взял root logger, потому что он лежит в основе всех вещей и будет обрабатывать все, что передается через другие appenders в других категориях (если не настроено иначе путем установки флага аддитивности).Если вам нужно знать, как работает регистрация и как определяется, где записываются журналы, прочитайте это руководство для получения дополнительной информации об этом.
Коротко:
выдаст вам логгер для категории "com.fizz".
Для приведенного выше примера это означает, что все, что было зарегистрировано с ним, будет передано в консоль и файл appender в корневом логгере.
Если вы добавляете appender в Logger.getLogger ("com.fizz"). AddAppender (newAppender), то вход в систему
fizz
будет обрабатываться всеми приложениями из корневого регистратора иnewAppender
.Вы не создаете регистраторы с конфигурацией, вы просто предоставляете обработчики для всех возможных категорий в вашей системе.
источник
Logger fizz = LoggerFactory.getLogger("com.fizz");
спасибо!Похоже, вы пытаетесь использовать log4j с «обоих концов» (конечного пользователя и конечного пункта конфигурации).
Если вы хотите закодировать в API-интерфейсе slf4j, но заранее определить (и программно) конфигурацию Log4j Logger, которую вернет classpath, вам абсолютно необходимо иметь какую-то адаптацию регистрации, которая использует ленивую конструкцию.
При таком подходе вам не нужно беспокоиться о том, где и когда ваши регистраторы log4j будут настроены. В первый раз, когда classpath запрашивает их, они лениво создаются, передаются обратно и становятся доступными через slf4j. Надеюсь, это помогло!
источник
Если вы определили appender в свойствах log4j и хотите обновить его программно, задайте имя в свойствах log4j и получите его по имени.
Вот пример записи в log4j.properties:
Чтобы обновить его, сделайте следующее:
источник
Если кто-то ищет программную настройку log4j2 на Java, эта ссылка может помочь: ( https://www.studytonight.com/post/log4j2-programmatic-configuration-in-java-class )
Вот основной код для настройки Console Appender:
Это перенастроит rootLogger по умолчанию, а также создаст новый appender .
источник