java - example - slf4j



Вы находите java.util.logging достаточным? (12)

Зависимости регистрации в сторонних библиотеках

Регистрация Java JDK в большинстве случаев сама по себе недостаточна. Однако, если у вас есть большой проект, который использует несколько сторонних библиотек с открытым исходным кодом, вы быстро обнаружите, что многие из них имеют разрозненные зависимости ведения журнала.

Именно в тех случаях, когда необходимо абстрагировать свой API ведения журнала от вашей реализации регистрации, важно. Я рекомендую использовать slf4j или logback (использует API slf4j) в качестве вашего API, и если вы хотите использовать Java JDK logging, вы все равно можете! Slf4j может выводить на множество различных реализаций регистрации без проблем.

Конкретный пример его полезности произошел во время недавнего проекта: нам нужно было использовать сторонние библиотеки, которые нуждались в log4j, но мы не хотели запускать две системы ведения журнала рядом друг с другом, поэтому мы использовали библиотеки slf4j log4j api wrapper и проблему была решена.

Таким образом, протоколирование Java JDK прекрасное, но стандартизованный API, который используется в моих сторонних библиотеках, сэкономит ваше время в долгосрочной перспективе. Просто попробуйте представить рефакторинг каждого заявления о регистрации!

https://src-bin.com

По названию вы находите стандартную структуру ведения журналов Java, достаточную для ваших нужд?

Используете ли вы альтернативные услуги регистрации, такие как log4j или другие? Если да, то почему? Я хотел бы услышать любой совет, который у вас есть относительно требований к регистрации в проектах разных типов, и когда интеграция фреймворков действительно необходима и / или полезна.


Answer #1

java.util.logging (jul) был ненужным с самого начала. Просто проигнорируйте это.

jul сам по себе имеет следующие недостатки:

  • В то время, когда jul был внедрен в Java 1.4, в широком использовании уже существует хорошо зарекомендовавшая себя система ведения журнала: LOG4J
  • предопределенные уровни журнала: SEVERE, WARNING, INFO, CONFIG, FINE, FINER, FINEST. Я не буду говорить вам, что я лично думаю об этих предопределенных уровнях, чтобы этот ответ был полуинтересным.
  • Можно определить дополнительные уровни. jul поддерживает до 4G разных уровней бревен, которые немного перегружены, ИМХО. Меньше иногда бывает больше.
  • Самый важный момент: если вы решитесь определить свой собственный уровень журнала, вы, вероятно, столкнетесь с проблемой утечки памяти!
    Здесь вы можете прочитать об этом эффекте:

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

  • он находится в пространстве имен java. *, поэтому реализация не может быть обменена во время выполнения. Это эффективно предотвращает переключение на SLF4J так же, как это возможно в случае commons.logging и LOG4J. То, как происходит перемычка для jul, влияет на производительность. Это делает jul самой негибкой структурой каротажа.
  • Внедряя jul, Sun неявно определила его как «стандартную структуру ведения журналов Java». Это привело к распространенному заблуждению, что «хороший гражданин Java» должен использовать jul в своих библиотеках или приложениях.
    Противоположный случай.
    Если вы используете либо commons.logging, либо LOG4j, вы сможете обменять фактически используемую структуру ведения журнала, если вам когда-либо понадобится, путем соединения с SLF4J. Это означает, что библиотеки, использующие commons.logging, LOG4J или SLF4J, могут регистрироваться в одной и той же цели ведения журнала, например, в файле.

Я лично предложил бы использовать SLF4J + logback для всех целей ведения журнала. Оба проекта координируются Ceki Gülcü, парнем позади LOG4J.
SLF4J является достойным (но неофициальным, поскольку он не из той же группы), преемником commons.logging. Это менее проблематично, чем CL, потому что он статически решает фактически используемый бэкэндинг ведения журнала. Кроме того, он имеет более богатый API, чем CL.
С другой стороны, логин является (un) официальным преемником LOG4J. Он реализует SLF4J изначально, поэтому нет никаких накладных расходов, вызванных какой-либо оберткой.

Теперь вы можете понизить меня, если вы все еще думаете, что я этого заслуживаю. ;)


Answer #2

В проектах, над которыми я работаю, мы, как правило, используем коммерческую регистрацию из Джакарты. Это не сама система регистрации, вместо этого она может обернуть некоторые из наиболее распространенных логгеров - log4j, java.util.logging или другие.

При этом относительно легко можно переключить ведение журнала на основе среды, к которой развертывается приложение (разработчик может захотеть использовать simplelog или java.util.logging на своей машине из-за простоты обслуживания, тогда как в системе SIT log4j с общей конфигурацией для всех приложений, которые могут быть развернуты и т. д.)


Answer #3

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

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

  1. Это может быть так же просто, как текстовые файлы, которые перекатываются.
  2. Это может быть более сложным, как ведение журнала в JMS или базе данных.
  3. Для исполнения, аудита и т. Д. Могут потребоваться отдельные журналы.
  4. Это может потребовать отправки электронной почты, когда происходит событие журнала.

Log4J в своем пакете varia поддерживал эти и другие и тестировал их API. Теперь с java.util.logging вы сможете загрузить их, но они не так широко известны, как Log4J, и, возможно, сложнее найти информацию.

Еще одна вещь, которую стоит рассмотреть - это API-интерфейс поставщика, который вы используете. Большинство поставщиков «навязывают» API регистрации для вас. Весна - одна из них, которая требует коллективной регистрации.

Как разработчик, я бы попытался использовать java.util.logging, если мог, для своих собственных вещей, но в реальных сценариях вам нужно встряхнуть то, что им нужно в операциях, и позволить этому выбрать ваш выбор, потому что это те, кто имеет для использования этих журналов, когда приложение выходит в эфир. Ни разработчик приложений, ни разработчики не должны делать такой выбор, хотя они должны делать предложения.


Answer #4

Если вам нужно войти в ваше приложение, вы, вероятно, сделали что-то действительно не так. Я бы сказал, что сообщение о случайных проблемах в порядке, но наличие отладки, инструкции info etc во многих классах с логикой является неправильным. Любое большое приложение с протоколированием в большинстве своих заполненных логикой классов будет равносильно информационной перегрузке, даже если вы выбираете только правильные регистраторы. В большинстве случаев информация будет неполной, шумной или фактической информации, которая вам нужна, просто отсутствует.

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

  • проблемы с формированием в текстовом файле конфигурации.
  • Проблемы с открытием или определением требуемого файла.

Answer #5

Если у вас нет веской причины использовать что-то вне JDK, я предпочитаю использовать то, что предоставляется Sun.

Многие из проектов, которые используют журнал Log4J, использовали его до того, как существовал «стандартный» протокол ведения журнала.


Answer #6

Мне не удалось выяснить, как контролировать уровень ведения журнала отдельных классов в рамках java.util.logging, что возможно в log4j. Если мне не удается диагностировать ошибку или существует класс с высоким трафиком, который регистрирует важную информацию, я могу изменить уровень для одного класса, чтобы регистрировать больше и оставлять остальные мои классы относительно спокойными.

NB Возможно, я не мог понять, как это сделать, или java.util.logging может измениться с тех пор, как я попробовал.


Answer #7

Мы используем log4j с log4j журнала сообщества . Я думаю, мы просто используем их, потому что все это делают. Это, и мы использовали log4j перед поддержкой jdk.

Редактировать: Просто потому, что все остальные делали это шутка, но, вероятно, почему я начал работу с log4j и commons logging.

Вот несколько причин для использования регистрации в сообществах.


Answer #8

Одна вещь, которую никто не упоминал в этой теме - java.util.logging не поддерживает syslog из коробки. Для меня это разрывает сделку (и заставил меня немного испугаться, чтобы реорганизовать материал java.util.logging вместо чего-то с немного большим количеством сока.

Вот что я сегодня встретил:

  • http://logging.apache.org/log4j/1.2/ - один и тот же, хотя, похоже, он немного стареет.

  • SLF4J - Я пытаюсь взять корону log4j, похоже, имеет какое-то поведение моста / перенаправления. Возможно, он подходит для замены, но я не мог найти никаких ясных примеров. Я должен потратить больше времени на это.

  • http://syslog4j.org/ - Это syslogs, но у меня не было замены на замену (ничего похожего, не делайте java-ребята, а не syslog много или что-то еще?)

  • http://people.apache.org/~psmith/logging.apache.org/sandbox/jul-log4j-bridge/apidocs/org/apache/logging/julbridge/JULLog4jBridge.html - jul-log4j-bridge рекламирует, что его падение замены, выглядело многообещающим и имело небольшой след.


Answer #9

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

У вас может быть отключен уровень (отладка), или вы можете отключить один пакет.

Я потратил слишком много времени, полагая, что заявление отладки будет печататься, а это не так. Теперь я в основном полагаюсь на System.out.println () и просто просматриваю и удаляю или конвертирую их, когда я закончил отладку.

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

Ведение журнала не так сложно и, безусловно, оправдано в большинстве крупных проектов.


Answer #10

Я думал, что буду использовать log4j - как упоминалось в @ ScArcher2, только потому, что все это делают. Но после рассмотрения обоих вариантов я узнал, что java.util.logging достаточно достаточен для большинства моих потребностей - и я говорю об огромной системе, в которой работают многие распространенные компоненты.

Поэтому, на мой взгляд, нет необходимости использовать альтернативные услуги. Java.util.logging достаточно эффективен для большинства случаев.


Answer #11

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

logger.debug("The new entry is {}. It replaces {}.", entry, oldEntry);

Вместо этого:

logger.debug("The new entry is " + entry + ". It replaces " + oldEntry + ".");

И все это строковое манипулирование выполняется только в том случае, если оператор фактически зарегистрирован. Выглядит тоже чище.

Следует отметить, что SLF4J является оберткой, такой как commons-logging, хотя она утверждает, что она менее подвержена проблемам загрузчика классов Commons-logging.





frameworks