Зачем использовать один из следующих пакетов вместо другого?
- Запись в Java
- Запись в Commons
- Log4j
- SLF4J
- Logback
Зачем использовать один из следующих пакетов вместо другого?
В хронологическом порядке api apperance (насколько я знаю):
logger.debug("The entry is {}.", entry);
//which expands effectively to
if (logger.isDebugEnabled()){
// Note that it actually *more* efficient than this - see Huxi comment below...
logger.debug("The entry is " + entry + ".");
}
Я нахожу, что регистрация на Java является запутанной, непоследовательной, плохо документированной и, в частности, беспорядочной. Кроме того, существует огромное количество сходства между этими структурами ведения журнала, что приводит к дублированию усилий и путанице в отношении того, в какой среде ведения журнала вы находитесь. В частности, если вы работаете в серьезном стеке веб-приложений Java, вы часто находитесь в одновременное использование нескольких журнальных сред; (например, hibernate может использовать log4j и tomcat java.util.logging). Apache commons предназначен для объединения различных фреймворков регистрации, но на самом деле просто добавляет больше сложности. Если вы этого заранее не знаете, это совершенно сбивает с толку. Почему мои сообщения журнала не распечатываются на консоли и т.д.? Ох, потому что я смотрю журналы Tomcat, а не log4j. Добавляя еще один уровень сложности, сервер приложений может иметь глобальные конфигурации протоколирования, которые могут не распознавать локальные конфигурации для конкретного веб-приложения. Наконец, все эти фреймворки регистрации являются ПУТЕМ СЛИШКОМ СООТВЕТСТВУЮЩИМ. Вход в Java был дезорганизованным беспорядком, оставляя разработчиков такими, как я, разочарованный и смущенный.
В ранних версиях Java не было встроенной среды ведения журнала, приводящей к этому сценарию.
Там был один важный момент, который не упоминался ранее:
SLF4J (и как Logback, так и LOG4J в качестве бэкэнда протоколирования) поддерживают так называемый контекстный диагностический контекст (MDC, см. javadoc и документация).
Это, по существу, локально-потоковая карта < String, String > которые вы можете использовать для добавления дополнительной информации контекста в ваше событие регистрации. Текущее состояние MDC привязано к каждому событию.
Это может быть невероятно полезно, если вы помещаете в него такие вещи, как имя пользователя и URL-адрес запроса (в случае веб-приложения). Это можно сделать автоматически, используя фильтр, например.
См. также ответы на вопрос Каковы наилучшие методы для регистрации ошибки?, особенно:
Есть некоторый потенциал проблемы с загрузкой в Commons Logging.
Log4J и SLF4J были разработаны тот же человек, учащийся проблемы, обнаруженные на практике с помощью Log4J.
В нашем проекте мы используем LOG4j, и его очень легко использовать, как показал Стивен в своем примере. Мы также создали собственные классы шаблонов для LOG4j, чтобы вы могли создавать свои собственные схемы выходных файлов. Вы можете описать, как должен выглядеть ваш файл журнала. Можно улучшить исходные классы log4j.
Все свойства LOG4j, которые вы можете изменить в файле log4j.properties, чтобы вы могли использовать разные файлы для разных проектов.
Java-регистрация не является моим фаворитом, но это может быть связано с тем, что я использую log4j с самого начала.
Общий обзор ведения журналов дает основание для его существования: протоколирование из кода библиотеки, когда у вас нет контроля над базовой структурой ведения журнала. Очень важно для различных проектов Apache, которые будут связаны с внешними приложениями. Возможно, это не так важно для внутренних ИТ-проектов, где у вас есть полный контроль.
Тем не менее, я пишу в Commons Logging, как и многие другие разработчики, которых я знаю. Причина заключается в том, чтобы свести к минимуму ментальный багаж: вы можете изменять проекты или задания, а не изучать новую структуру (при условии, что новая работа/проект также использует CL, и/или вы можете убедить их перейти к ней).
Кроме того, существует некоторая ценность для создания собственных оболочек вокруг любой используемой структуры. Как описано здесь, мне нравится использовать объект LogWrapper для предоставления пользовательской строкой (важно) и минимизации визуального беспорядка операторов протоколирования (менее важно).
В общем случае я бы по умолчанию использовал Log4J.
Я бы использовал Java Logging, если бы не против зависимости от Java 1.4, но я бы по-прежнему использовал Log4J.
Я бы использовал Commons Logging, если бы я улучшал то, что уже использовало его.
Я бы предложил создать тонкий фасад регистрации, который может записываться в любую из фреймворков регистрации, после чего выбор механизма резервного копирования становится практически спорным.