Что случилось с логированием в Java?

Зачем использовать один из следующих пакетов вместо другого?

  • Ведение журнала Java
  • Ведение журнала Commons
  • Log4j
  • SLF4j
  • Логбэк

Возможно, вам понадобится stackoverflow.com/questions/873051, который сравнивает SLF4j с Commons Logging.

James McMahon 01.08.2009 00:04

Какого черта Цеки создал 3 фреймворка для ведения журнала !!! это безумие ...

mP. 04.01.2010 13:06

@mP. - первым был log4j, потом возникли разногласия, и было написано slf4j + logback. slf4j - это API, и выполните возврат реализации API. Независимо от всего остального, slf4j чрезвычайно полезен.

Thorbjørn Ravn Andersen 03.04.2012 13:13

Подробнее о том, почему Ceki Gülcü действительно создал SLF4J + Logback, см. В следующем выступлении Devoxx: parleys.com/#st=5&id=1701

Alex Bitek 15.05.2012 23:00

Лучшее, что из этого выйдет, - это API slf4j, который, надеюсь, объединит мир ведения журналов. Я думаю, что логбэк еще не достиг критической массы у разработчиков.

Thorbjørn Ravn Andersen 21.12.2015 22:43
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
117
5
12 633
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

Ответ принят как подходящий

В хронологическом порядке появления api (насколько мне известно):

  • Log4j, потому что его используют почти все (по моему опыту)
  • Commons Logging, потому что его используют проекты с открытым исходным кодом (чтобы они могли интегрироваться с любой платформой ведения журнала, используемой в интегрированном решении); особенно актуально, если вы являетесь API / Framework / OSS и полагаетесь на другие пакеты, которые используют Commons Logging.
  • Commons Logging, потому что вы не хотите «ограничиваться» определенной структурой ведения журнала (вместо этого вы ограничиваетесь тем, что дает вам Commons Logging) - я не думаю, что разумно использовать этот момент в качестве причины.
  • Ведение журнала Java, потому что вы не хотите добавлять дополнительную банку.
  • SLF4j, потому что он новее, чем Commons Logging, и обеспечивает параметризованное ведение журнала:

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 + "."); 
}
  • Logback, потому что он новее, чем log4j, и снова поддерживает параметризованное ведение журнала, поскольку он напрямую реализует SLF4j
  • SLF4j / Logback, потому что он написан тем же парнем, что и log4j, поэтому он сделал его лучше (согласно Ken G - спасибо. Кажется, подходит, если смотреть на их предыдущие посты в новостях)
  • SLF4j, потому что они также публикуют адаптер log4j, поэтому вам не нужно «отключать» log4j в старом коде - просто заставьте log4j.properties использовать SLF4j и его конфигурацию

Насколько я могу судить, идея ведения журнала Commons заключается в том, что его следует использовать в библиотеках. Таким образом, библиотека всегда может использовать ту же структуру ведения журнала (через ведение журнала общего пользования), которую использует хостинговое приложение.

Joachim Sauer 10.12.2008 16:29

Большое спасибо Локи за вопрос. Теперь я знаю, что больше не собираюсь использовать log4j в качестве фреймворка по умолчанию. SLF4j FTW! Также спасибо Ken G за то, что он указал, что SLF4j написан тем же парнем, что и log4j.

Stephen 11.12.2008 02:32

Комментарий в вашем примере кода неверен на 100%. Фактическое форматирование сообщения выполняется Logback лениво, поэтому это произойдет только в том случае, если событие действительно обрабатывается приложением а также, приложение требует форматированного сообщения - чего не произойдет, например, в случае, например, SocketAppender, поскольку событие сериализуется с использованием неизмененного шаблона сообщения + аргументы в виде строк. Я полагаю, это просто зависит от того, как вы определяете «эффективно». Он определенно выдаст одно и то же сообщение (по крайней мере, если запись и объект совпадают;)), поэтому, пожалуйста, извините за мои придирки.

Huxi 03.06.2009 07:32

SLF4J на самом деле - это просто API, который находится поверх других фреймворков ведения журналов. Подобно цели Commons Logging, но, судя по моему опыту, более интуитивно понятно.

James McMahon 24.06.2009 21:57

Обычно я бы по умолчанию использовал Log4J.

Я бы использовал ведение журнала Java, если бы не возражал против зависимости от Java 1.4, но все же предпочел бы использовать Log4J.

Я бы использовал Commons Logging, если бы улучшал то, что уже использовал.

Не возражал против зависимости от 1.4 ?? Даже 1.4 подошел к концу срока службы.

Tom Hawtin - tackline 23.01.2009 18:47

@Tom Он имеет в виду jdk1.4 +, не будь глупым.

mP. 04.01.2010 13:05

На самом деле я недавно проделал некоторую работу в системе, которая все еще работала под jdk 1.3 :-(, и это было меньше двух лет назад, я последний раз поддерживал систему jdk 1.2. Слишком много мест не обновляются, если в них нет крайней необходимости , они просто отказываются устанавливать обновления.

Michael Rutherfurd 08.01.2010 10:29

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

Это то, что делает обычная регистрация, так зачем изобретать велосипед? Также есть некоторые проблемы, которые ваш фасад должен будет решить, что уже делает общий журнал.

James A. N. Stauffer 10.12.2008 07:23

+1 Чтобы противостоять аргументу о ведении журнала, некоторые корпоративные приложения используют настраиваемое средство ведения журнала. Всегда полезно скрыть базовую реализацию. «Тонкая» обертка избавляет от необходимости упаковывать еще одну банку и требует меньше усилий, чем изобретать заново.

questzen 10.12.2008 12:27

Этот подход применим во многих случаях, особенно когда ваш код должен работать на произвольной платформе. Базовый API ведения журналов на серверах приложений обычно отличается от, например, Eclipse.

McDowell 10.12.2008 13:29

О сокрытии базовой реализации: все упомянутые API журналирования могут делать именно это: они являются интерфейсами для подключаемых реализаций.

Thilo 11.12.2008 02:47

Это спасло меня недавно, когда мы портировали наш фреймворк на Compact Framework (в .Net). Если бы у нас были жестко запрограммированные зависимости от nLog, мы бы ошиблись. Поскольку мы использовали этот подход, мы смогли добавить нулевой регистратор и порадоваться. Кто-нибудь проголосует за меня до 0, пожалуйста :-)

tsimon 15.12.2008 09:06

Один уже существует - взгляните на slf4j. Это общепринятая тонкая оболочка, которая позволяет переключать фреймворки ведения журналов при запуске приложения, переключая jar-файлы в пути к классам среды выполнения.

deterb 09.06.2009 21:01

У засорения есть свой способ узнать, какой фреймворк он будет использовать - это не красиво и довольно запутанно. Сколько фреймворков логирования создал Ceki. Всегда следует стремиться выделить уровень взаимного взаимодействия и скрыть реализацию, даже если она засоряется вашим собственным журналированием. За кулисами вы можете подключить все, что пожелаете, как упомянул Трэвис.

mP. 04.01.2010 13:03

В проекте нашей компании мы используем 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, кстати, но вы можете возразить, что я предвзят.

Huxi 03.06.2009 07:38

Я считаю, что ведение журнала в Java сбивает с толку, непоследовательно, плохо документировано и особенно бессистемно. Более того, между этими фреймворками ведения журнала существует огромное количество сходства, что приводит к дублированию усилий и путанице относительно того, в какой среде ведения журнала вы на самом деле находитесь. В частности, если вы работаете в серьезном стеке веб-приложений Java, вы часто находитесь в несколько журналирования среды за один раз; (например, спящий режим может использовать log4j и tomcat java.util.logging). Apache Commons предназначен для объединения различных платформ ведения журналов, но на самом деле просто добавляет больше сложности. Если вы не знаете этого заранее, это вызывает крайнее недоумение. Почему мои сообщения журнала не выводятся на консоль и т. д.? Ох, потому что я смотрю журналы Tomcat, а не log4j. Добавляя еще один уровень сложности, сервер приложений может иметь глобальные конфигурации ведения журнала, которые могут не распознавать локальные конфигурации для конкретного веб-приложения. Наконец, все эти структуры ведения журналов СЛИШКОМ СЛОЖНЫ. Вход в Java был беспорядочным и беспорядочным, оставляя таких разработчиков, как я, разочарованными и сбитыми с толку.

В ранних версиях Java не было встроенной среды ведения журнала, ведущей к этому сценарию.

Это ответ? Это больше похоже на разглагольствование.

Michael Myers 12.03.2009 00:47

Мне жаль. Это является немного напыщенная речь. Но это также убедительный ответ на вопрос «Что случилось с ведением журнала в Java?». Короче говоря, он глубоко сломан.

Julien Chastang 12.03.2009 02:02

ну это не стоит -1 голоса; P Но есть над чем задуматься.

guyumu 12.03.2009 08:35

Проблемы начались, когда Sun фактически добавила java.util.logging в Java 1.4. До этого LOG4J был хорошо известен и широко использовался. После этого возникла необходимость в оболочках для поддержки как LOG4J, так и java.util.logging. Кроме того, поскольку jul содержится в пакете java. *, Его нельзя заменить заменой JAR - таким образом SLF4J соединяет другие фреймворки. Вероятно, это была худшая идея Sun за всю историю ... и в конечном итоге она привела к неверному предположению, что "хороший гражданин Java" должен использовать jul.

Huxi 03.06.2009 07:48

@Huxi, я утверждаю, что Calendar API был хуже. В защиту Sun это был не их код, а исходил от Таглиента.

Thorbjørn Ravn Andersen 25.04.2012 11:17

Есть один важный момент, о котором раньше не упоминалось:

SLF4J (и Logback, и LOG4J в качестве серверной части журналирования) поддерживают так называемый сопоставленный диагностический контекст (MDC, см. javadoc и документация).

По сути, это локальная для потока карта <String, String>, которую вы можете использовать для добавления дополнительной контекстной информации к вашему событию регистрации. Текущее состояние MDC привязано к каждому событию.

Это может быть невероятно полезно, если вы добавите в него такие вещи, как имя пользователя и URL-адрес запроса (в случае веб-приложения). Это можно сделать автоматически, например, с помощью фильтра.

Технически это локальный поток Map <String, String>.

pdxleif 27.04.2012 11:14

Другие вопросы по теме