Зачем использовать один из следующих пакетов вместо другого?
Какого черта Цеки создал 3 фреймворка для ведения журнала !!! это безумие ...
@mP. - первым был log4j, потом возникли разногласия, и было написано slf4j + logback. slf4j - это API, и выполните возврат реализации API. Независимо от всего остального, slf4j чрезвычайно полезен.
Подробнее о том, почему Ceki Gülcü действительно создал SLF4J + Logback, см. В следующем выступлении Devoxx: parleys.com/#st=5&id=1701
Лучшее, что из этого выйдет, - это API slf4j, который, надеюсь, объединит мир ведения журналов. Я думаю, что логбэк еще не достиг критической массы у разработчиков.




В хронологическом порядке появления api (насколько мне известно):
logger.debug("The entry is {}.", entry);
//which expands effectively to
if (logger.isDebugEnabled()){
// Note that it's actually *more* efficient than this - see Huxi's comment below...
logger.debug("The entry is " + entry + ".");
}
Насколько я могу судить, идея ведения журнала Commons заключается в том, что его следует использовать в библиотеках. Таким образом, библиотека всегда может использовать ту же структуру ведения журнала (через ведение журнала общего пользования), которую использует хостинговое приложение.
Большое спасибо Локи за вопрос. Теперь я знаю, что больше не собираюсь использовать log4j в качестве фреймворка по умолчанию. SLF4j FTW! Также спасибо Ken G за то, что он указал, что SLF4j написан тем же парнем, что и log4j.
Комментарий в вашем примере кода неверен на 100%. Фактическое форматирование сообщения выполняется Logback лениво, поэтому это произойдет только в том случае, если событие действительно обрабатывается приложением а также, приложение требует форматированного сообщения - чего не произойдет, например, в случае, например, SocketAppender, поскольку событие сериализуется с использованием неизмененного шаблона сообщения + аргументы в виде строк. Я полагаю, это просто зависит от того, как вы определяете «эффективно». Он определенно выдаст одно и то же сообщение (по крайней мере, если запись и объект совпадают;)), поэтому, пожалуйста, извините за мои придирки.
SLF4J на самом деле - это просто API, который находится поверх других фреймворков ведения журналов. Подобно цели Commons Logging, но, судя по моему опыту, более интуитивно понятно.
Обычно я бы по умолчанию использовал Log4J.
Я бы использовал ведение журнала Java, если бы не возражал против зависимости от Java 1.4, но все же предпочел бы использовать Log4J.
Я бы использовал Commons Logging, если бы улучшал то, что уже использовал.
Не возражал против зависимости от 1.4 ?? Даже 1.4 подошел к концу срока службы.
@Tom Он имеет в виду jdk1.4 +, не будь глупым.
На самом деле я недавно проделал некоторую работу в системе, которая все еще работала под jdk 1.3 :-(, и это было меньше двух лет назад, я последний раз поддерживал систему jdk 1.2. Слишком много мест не обновляются, если в них нет крайней необходимости , они просто отказываются устанавливать обновления.
Я бы предложил создать тонкий фасад журналирования, который может писать в любую из фреймворков журналирования, после чего выбор механизма поддержки становится в значительной степени спорным.
Это то, что делает обычная регистрация, так зачем изобретать велосипед? Также есть некоторые проблемы, которые ваш фасад должен будет решить, что уже делает общий журнал.
+1 Чтобы противостоять аргументу о ведении журнала, некоторые корпоративные приложения используют настраиваемое средство ведения журнала. Всегда полезно скрыть базовую реализацию. «Тонкая» обертка избавляет от необходимости упаковывать еще одну банку и требует меньше усилий, чем изобретать заново.
Этот подход применим во многих случаях, особенно когда ваш код должен работать на произвольной платформе. Базовый API ведения журналов на серверах приложений обычно отличается от, например, Eclipse.
О сокрытии базовой реализации: все упомянутые API журналирования могут делать именно это: они являются интерфейсами для подключаемых реализаций.
Это спасло меня недавно, когда мы портировали наш фреймворк на Compact Framework (в .Net). Если бы у нас были жестко запрограммированные зависимости от nLog, мы бы ошиблись. Поскольку мы использовали этот подход, мы смогли добавить нулевой регистратор и порадоваться. Кто-нибудь проголосует за меня до 0, пожалуйста :-)
Один уже существует - взгляните на slf4j. Это общепринятая тонкая оболочка, которая позволяет переключать фреймворки ведения журналов при запуске приложения, переключая jar-файлы в пути к классам среды выполнения.
У засорения есть свой способ узнать, какой фреймворк он будет использовать - это не красиво и довольно запутанно. Сколько фреймворков логирования создал Ceki. Всегда следует стремиться выделить уровень взаимного взаимодействия и скрыть реализацию, даже если она засоряется вашим собственным журналированием. За кулисами вы можете подключить все, что пожелаете, как упомянул Трэвис.
В проекте нашей компании мы используем LOG4j, и он очень прост в использовании, как показал Стивен в своем примере. Мы также написали наши собственные классы шаблонов для LOG4j, чтобы вы могли создавать свои собственные схемы выходных файлов. Вы можете описать, как должен выглядеть ваш файл журнала. Можно улучшить исходные классы log4j.
Все свойства LOG4j вы можете изменить в файле log4j.properties, чтобы вы могли использовать разные файлы для разных проектов.
Ведение журнала Java мне не нравится, но это может быть связано с тем, что я использую log4j с самого начала.
См. Также ответы на вопрос Как лучше всего регистрировать ошибку?, особенно:
Есть некоторый потенциал проблемы с загрузкой классов с Commons Логирование.
Log4J и SLF4J были разработаны тот же человек, учится у проблемы, обнаруженные на практике с Log4J.
Обзор Commons Logging объясняет причину своего существования: ведение журнала из кода библиотеки, когда у вас нет контроля над базовой структурой ведения журнала. Очень важно для различных проектов Apache, которые будут связаны с внешними приложениями. Возможно, это не так важно для внутренних ИТ-проектов, где у вас есть полный контроль.
Тем не менее, я пишу в Commons Logging, как и многие другие разработчики, которых я знаю. Причина в том, чтобы свести к минимуму умственный багаж: вы можете менять проекты или работу, и вам не нужно изучать новую структуру (при условии, что новая работа / проект также использует CL, и / или вы можете убедить их перейти на нее).
Кроме того, есть некоторая ценность в создании собственных оболочек для любого фреймворка, который вы используете. Как описано здесь, мне нравится использовать объект LogWrapper для обеспечения настраиваемой строковой привязки (важно) и минимизировать визуальный беспорядок операторов ведения журнала (менее важно).
Также есть мост commons.logging => SLF4J, который можно использовать для маршрутизации всех журналов CL через SLF4J. SLF4J поддерживает соединение commons.logging, LOG4J и (немного громоздко, но максимально хорошо) java.util.logging, поэтому все журналы будут помещены в любой сервер SLF4J, который вы будете использовать. См. slf4j.org/legacy.html Я бы использовал Logback, кстати, но вы можете возразить, что я предвзят.
Я считаю, что ведение журнала в Java сбивает с толку, непоследовательно, плохо документировано и особенно бессистемно. Более того, между этими фреймворками ведения журнала существует огромное количество сходства, что приводит к дублированию усилий и путанице относительно того, в какой среде ведения журнала вы на самом деле находитесь. В частности, если вы работаете в серьезном стеке веб-приложений Java, вы часто находитесь в несколько журналирования среды за один раз; (например, спящий режим может использовать log4j и tomcat java.util.logging). Apache Commons предназначен для объединения различных платформ ведения журналов, но на самом деле просто добавляет больше сложности. Если вы не знаете этого заранее, это вызывает крайнее недоумение. Почему мои сообщения журнала не выводятся на консоль и т. д.? Ох, потому что я смотрю журналы Tomcat, а не log4j. Добавляя еще один уровень сложности, сервер приложений может иметь глобальные конфигурации ведения журнала, которые могут не распознавать локальные конфигурации для конкретного веб-приложения. Наконец, все эти структуры ведения журналов СЛИШКОМ СЛОЖНЫ. Вход в Java был беспорядочным и беспорядочным, оставляя таких разработчиков, как я, разочарованными и сбитыми с толку.
В ранних версиях Java не было встроенной среды ведения журнала, ведущей к этому сценарию.
Это ответ? Это больше похоже на разглагольствование.
Мне жаль. Это является немного напыщенная речь. Но это также убедительный ответ на вопрос «Что случилось с ведением журнала в Java?». Короче говоря, он глубоко сломан.
ну это не стоит -1 голоса; P Но есть над чем задуматься.
Проблемы начались, когда Sun фактически добавила java.util.logging в Java 1.4. До этого LOG4J был хорошо известен и широко использовался. После этого возникла необходимость в оболочках для поддержки как LOG4J, так и java.util.logging. Кроме того, поскольку jul содержится в пакете java. *, Его нельзя заменить заменой JAR - таким образом SLF4J соединяет другие фреймворки. Вероятно, это была худшая идея Sun за всю историю ... и в конечном итоге она привела к неверному предположению, что "хороший гражданин Java" должен использовать jul.
@Huxi, я утверждаю, что Calendar API был хуже. В защиту Sun это был не их код, а исходил от Таглиента.
Есть один важный момент, о котором раньше не упоминалось:
SLF4J (и Logback, и LOG4J в качестве серверной части журналирования) поддерживают так называемый сопоставленный диагностический контекст (MDC, см. javadoc и документация).
По сути, это локальная для потока карта <String, String>, которую вы можете использовать для добавления дополнительной контекстной информации к вашему событию регистрации. Текущее состояние MDC привязано к каждому событию.
Это может быть невероятно полезно, если вы добавите в него такие вещи, как имя пользователя и URL-адрес запроса (в случае веб-приложения). Это можно сделать автоматически, например, с помощью фильтра.
Технически это локальный поток Map <String, String>.
Возможно, вам понадобится stackoverflow.com/questions/873051, который сравнивает SLF4j с Commons Logging.