Я хочу переоборудовать slf4j с Logback в устаревшее приложение. Хорошая вещь, у унаследованного приложения есть своя собственная структура регистрации. Поэтому все, что мне нужно было сделать, - это изменить структуру ведения журнала, чтобы записывать в журнал slf4j вместо log4j.
Это работало как сон. Я был счастлив, пока не заметил местоположение Logback, записываемого для каждого события журнала:
Logger.java:...
Yikes! Это не очень помогло моим коллегам-разработчикам, когда я пытался выяснить, откуда пришло событие журнала.
Как я могу сказать Logback, чтобы он смотрел на несколько уровней вверх в стеке, чтобы найти фактическое местоположение для записи?
Класс logger - это служебный класс с такими методами:
public static void debug(String clazz, String message) {
org.slf4j.Logger logger = LoggerFactory.getLogger(clazz);
logger.debug(message);
}
Нашел решение, просматривая исходный текст jcl-over-slf4j
. Большинство реализаций slf4j (включая logback) используют логгеры, реализующие LocationAwareLogger
, который имеет метод log, ожидающий в качестве одного из аргументов полное имя класса оберточного логгера:
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);
}
}
Как это сделать, смотрите в различных реализациях XXX-over-slf4j.
В основном вы хотите заменить ваш текущий фреймворк логгеров полностью. Не оборачивайте slf4j.
Редактировать:
Другим подходом может быть написание собственного макета, подкласса того, который вы используете сейчас, с измененным значением полей %m, %l и т.д., что позволяет обойтись без дополнительного стекового кадра.