При использовании log4j Logger.log(Priority p, Object message)
метод доступен и может использоваться для регистрации сообщения на уровне журнала, определяемом во время выполнения. Мы используем этот факт и этот совет для перенаправления stderr в средство ведения журнала на определенном уровне журнала.
У slf4j нет универсального log()
метода, который я могу найти. Означает ли это, что невозможно реализовать вышеизложенное?
slf4j 2.0
. jira.qos.ch/browse/SLF4J-124 См. мой ответ для получения подробностей и возможногоslf4j 1.x
обходного пути.Ответы:
Нет возможности сделать это с помощью
slf4j
.Я полагаю, что причина отсутствия этой функциональности заключается в том, что практически невозможно построить
Level
тип,slf4j
который можно эффективно сопоставить сLevel
(или эквивалентным) типом, используемым во всех возможных реализациях ведения журнала за фасадом. С другой стороны, дизайнеры решили, что ваш вариант использования слишком необычен, чтобы оправдать затраты на его поддержку.Что касается @ ripper234 «s потребительного случая (модульное тестирования), я думаю , что прагматичное решение изменить модульный тест (ы) с трудом проволочного знания о том , что система регистрации находится за SLF4J фасада ... при выполнении модульных тестов.
источник
org.slf4j.Logger
: отладка, ошибка, информация, трассировка, предупреждение.Ричард Фирн имеет правильную идею, поэтому я написал полный класс на основе его скелетного кода. Надеюсь, он достаточно короткий, чтобы разместить его здесь. Копируйте и вставляйте для удовольствия. Я, наверное, тоже должен добавить какое-нибудь магическое заклинание: «Этот код передан в общественное достояние»
источник
Попробуйте переключиться на Logback и использовать
Я считаю, что это будет единственный вызов Logback, а остальная часть вашего кода останется без изменений. Logback использует SLF4J, и миграция будет безболезненной, нужно будет изменить только файлы конфигурации xml.
Не забудьте вернуть уровень журнала после того, как закончите.
источник
Вы можете реализовать это, используя лямбды Java 8.
источник
LevelLogger
), что не очень хорошо, потому что обычно это очень полезная информация.Это можно сделать с
enum
помощью вспомогательного метода и:Вы можете добавить другие варианты
log
, скажем, если вам нужны общие эквиваленты 1-параметрического или 2-параметрическогоwarn
/error
/ и т.д. SLF4J . методы.источник
Любой, кто хочет получить полностью совместимое с SLF4J решение этой проблемы, может захотеть проверить Lidalia SLF4J Extensions - это на Maven Central.
источник
Мне просто нужно было что-то подобное, и я придумал:
использование:
Регистратор передается во время вызова, поэтому информация о классе должна быть в порядке, и она хорошо работает с аннотацией @ Slf4j lombok.
источник
DEBUG
отсутствует как константа.LogLevel
как класс иlog
как метод, что делает журналы менее значимыми.Это не возможно определить уровень протоколирования в sjf4j
1.x
из коробки. Но есть надежда, что slf4j2.0
исправит проблему . В версии 2.0 это могло бы выглядеть так:Между тем, для slf4j 1.x вы можете использовать этот обходной путь:
Скопируйте этот класс в свой путь к классам:
Тогда вы можете использовать это так:
В результате будет выведен такой журнал:
Стоит ли оно того?
LogLevel
Исходный код в качестве минимального примера размещен на GitHub .
источник
LogMethod
интерфейс должен быть общедоступным, чтобы он мог работать с классами вне своего пакета. В остальном он работает по назначению. Спасибо!С помощью slf4j API невозможно динамически изменять уровень журнала, но вы можете настроить логбэк (если вы его используете) самостоятельно. В этом случае создайте фабричный класс для вашего регистратора и внедрите корневой регистратор с необходимой вам конфигурацией.
После настройки корневого регистратора (достаточно одного раза) вы можете делегировать получение нового регистратора
Не забудьте использовать то же самое
loggerContext
.Изменить уровень журнала легко с помощью корневого регистратора, полученного из
loggerContext
.источник
Подтвердить ответ Ондрей Скопек
Вы получите результат:
источник
Я только что столкнулся с подобной потребностью. В моем случае slf4j настроен с помощью адаптера ведения журнала java (jdk14). Используя следующий фрагмент кода, мне удалось изменить уровень отладки во время выполнения:
источник
Основываясь на ответе massimo virgilio, мне также удалось сделать это с помощью slf4j-log4j, используя интроспекцию. HTH.
источник
Вот решение лямбда, не такое удобное для пользователя, как @Paul Croarkin с одной стороны (уровень фактически проходит дважды). Но я думаю: (а) пользователь должен передать Регистратор; и (b) AFAIU исходный вопрос не требовал удобного способа для всего приложения, а только в ситуации с небольшим количеством использований внутри библиотеки.
Поскольку slf4j позволяет использовать Throwable (трассировка стека которого должна регистрироваться) внутри параметра varargs , я думаю, что нет необходимости перегружать
log
вспомогательный метод для других потребителей, кроме(String, Object[])
.источник
Я смог сделать это для привязки JDK14, сначала запросив экземпляр SLF4J Logger, а затем установив уровень привязки - вы можете попробовать это для привязки Log4J.
источник
Я использую метод импорта модулей ch.qos.logback с последующим преобразованием экземпляра slf4j Logger в ch.qos.logback.classic.Logger. Этот экземпляр включает метод setLevel ().
Чтобы узнать возможные уровни ведения журнала, вы можете развернуть класс ch.qos.logback, чтобы увидеть все возможные значения для уровня :
Результаты следующие:
источник
используя интроспекцию java, вы можете сделать это, например:
источник
нет, у него есть несколько методов, info (), debug (), warn () и т. д. (это заменяет поле приоритета)
посмотрите http://www.slf4j.org/api/org/slf4j/Logger.html для получения полного API Logger.
источник