2010-08-16 4 views
6

Я хочу модифицировать slf4j с помощью Logback в устаревшем приложении. Хорошо, устаревшее приложение имеет собственную структуру ведения журнала. Таким образом, все, что мне нужно было сделать, это изменить структуру ведения журнала для входа в slf4j вместо log4j.Обтекание slf4j API

Он работал как сон. Я был доволен, пока не заметил, что в журнале регистрируется каждое событие журнала:

Logger.java:... 

Yikes! Это не помогло бы моим коллегам-разработчикам, когда пытались выяснить, откуда произошло событие журнала.

Как я могу сказать, что Logback выглядит несколько уровней в стеке для фактического местоположения для регистрации?

Класс регистратор утилита класс с методами, как это:

public static void debug(String clazz, String message) { 
    org.slf4j.Logger logger = LoggerFactory.getLogger(clazz); 
    logger.debug(message); 
} 
+1

подобный вопрос: HTTP: // stackoverflow.com/questions/1486233/java-logging-show-the-source-line-number-of-the-caller-not-the-logging-helper-m – Thilo

+0

сделал это, когда использовал log4j? Я думаю, так как вы обновили существующий класс ведения журнала, вы не добавили дополнительный фрейм в стек вызовов, поэтому версия log4j должна была проявить ту же проблему. – Thilo

+1

log4j предоставляет метод журнала в своем общедоступном API, который выглядит дополнительным фреймом в стеке, а slf4j - нет. Так что да, он работал с log4j. –

ответ

10

Нашли решение, глядя на источник jcl-over-slf4j. Большинство реализаций SLF4J (включая Logback) используют регистраторы, которые реализуют LocationAwareLogger, который имеет метод журнала, который ожидает полное имя класса класса оберточной регистратора в качестве одного из его аргументов:

private static final String FQCN = Logger.class.getName(); 


public static void debug(String clazz, String message) { 
    org.slf4j.Logger logger = LoggerFactory.getLogger(clazz); 
    if (logger instanceof LocationAwareLogger) { 
     ((LocationAwareLogger) logger).log(null, FQCN, LocationAwareLogger.DEBUG_INT, message, null, null); 
    } else { 
     logger.debug(message); 
    } 
} 
5

См различных реализаций XXX-над-SLF4J о том, как это сделать.

В основном вы хотите, чтобы заменил ваш текущий каркас регистрации. Не завершать slf4j.

Edit:

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

+2

Я рассматривал это решение, но в настоящее время нет бюджета для замены 10000+ отчетов журнала, разбросанных по более чем 50 проектам. –

+0

Вам не нужно изменять операторы журнала, но код, который он называет (который, мы надеемся, находится в библиотеке) –

+1

В структуре журнала есть 10000+ вызовов методов от всех проектов к нему. Поэтому, если я заменил фреймворк logger, не придется ли мне заменять на него все вызовы методов? –

Смежные вопросы