Що відбувається з реєстрацією в Java? [зачинено]


117

Чому б один із наведених пакунків використовував замість іншого?

  • Реєстрація Java
  • Commons Ведення журналів
  • Log4j
  • SLF4j
  • Зворотний зв'язок

4
Ви можете stackoverflow.com/questions/873051 , який порівнює SLF4J з Commons Logging.
Джеймс Макмахон

24
Чому, чертво, Чекі створив 3 фреймових системи !!! це безумство ...
mP.

6
@mP. - log4j був першим, потім виникла незгода, і був написаний slf4j + logback. slf4j - це API і здійснює зворотній зв'язок реалізацію API. Незалежно від усього іншого, slf4j надзвичайно корисний.
Thorbjørn Ravn Andersen

3
Детальніше про те, чому Ceki Gülcü створив SLF4J + Зворотній зв'язок, див. Наступні розмови Devoxx
bitek

Найкраще з цього вийти API slf4j, який, сподіваємось, об'єднає світ журналу. Я думаю, що зворотний зв'язок ще не досяг критичної маси у розробників.
Thorbjørn Ravn Andersen

Відповіді:


86

У хронологічному порядку поява 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 + "."); 
}
  • Зворотний зв'язок, оскільки він новіший, ніж log4j і знову, підтримує параметризований журнал, оскільки він реалізує SLF4j безпосередньо
  • SLF4j / Зворотній зв'язок, тому що його написав той самий хлопець, який зробив log4j, тому він зробив це краще (за словами Кен Г - дякую. Здається, він підходить при перегляді їхніх попередніх новин )
  • SLF4j, оскільки вони також публікують адаптер log4j, тому вам не доведеться "вимикати" log4j у старшому коді - просто змусьте log4j.properties використовувати SLF4j і це конфігурація

3
Наскільки я можу сказати, ідея спільного ведення журналів полягає в тому, що його слід використовувати в бібліотеках. Таким чином, бібліотека завжди може використовувати ту саму систему реєстрації (за допомогою журналу загального користування), яку використовує хостинг-додаток.
Йоахім Зауер

Дякую Локі за запитання. Тепер я знаю, що більше не буду використовувати log4j як мою основу за замовчуванням. SLF4j FTW! Також дякую Кену Г за те, що він зазначив, що SLF4j написаний тим самим хлопцем, що і log4j
Стівен

3
Коментар у прикладі коду не на 100% правильний. Фактичне форматування повідомлення здійснює ліниво за допомогою Logback, тому це станеться лише в тому випадку, якщо подія дійсно обробляється додатком, і додаток вимагає відформатованого повідомлення - що не відбудеться у випадку, наприклад, SocketAppender, оскільки подія серіалізується за допомогою незмінний шаблон повідомлення + аргументи у вигляді рядків. Я думаю, це просто залежить від того, як ви визначаєте "ефективно", хоча. Це, звичайно, надсилає те саме повідомлення (принаймні, якщо запис та об’єкт однакові;)), тож пробачте про те, що я прислухався.
Хусі

6
SLF4J насправді є лише API, який розташовується поверх інших фреймворків журналів. Подібно до мети Commons Logging, але більш інтуїтивно зрозумілий з мого досвіду.
Джеймс Макмахон

37

Я вважаю, що ведення журналу на Java є заплутаним, непослідовним, погано задокументованим та особливо небезпечним. Більше того, між цими рамками ведення журналів існує величезна схожість, що призводить до дублювання зусиль та плутанини щодо того, в якому середовищі ведення журналу ви перебуваєте насправді. Зокрема, якщо ви працюєте в серйозному стеку веб-додатків Java, ви часто знаходитесь у кратніведення ведення ведення ведення журналу за один раз; (наприклад, сплячий може використовувати log4j та tomcat java.util.logging). Apache commons призначений для з'єднання різних фреймворків, але насправді лише додає більше складності. Якщо ви цього не знаєте достроково, це надзвичайно дивовижно. Чому мої повідомлення журналу не друкуються на консоль тощо? О, тому що я дивлюся на журнали Tomcat, а не log4j. Додаючи ще один рівень складності, сервер додатків може мати глобальні конфігурації журналу, які можуть не розпізнавати локальні конфігурації для конкретного веб-додатку. Нарешті, усі ці рамки ведення журналу ЛІГО ЗАВЕРШЕНІ. Вхід у Java був неорганізованим безладом, і такі розробники, як я, розчарувались і розгублені.

Ранні версії Java не мали вбудованої системи реєстрації журналів, що вела б до цього сценарію.


19
Це відповідь? Це більше схоже на тиражу.
Майкл Майерс

15
Вибачте. Це є трохи тиради. Але це також зухвалий відповідь на питання "Що відбувається з веденням журналу на Java?". Відповідь, коротше кажучи, чи глибоко зламана.
Жульєн Частанг

1
ну не варто -1 голос; P Але над чим задуматися.
guyumu

21
Проблеми почалися, коли Sun фактично додав java.util.logging до Java 1.4. До цього LOG4J був добре налагоджений і широко використовувався. Після цього з'явилася необхідність обгортки підтримувати як LOG4J, так і java.util.logging. Крім того, оскільки jul міститься в пакеті java. *, Його не можна замінити заміною JAR - це спосіб SLF4J з'єднувати інші рамки. Це, мабуть, найгірша ідея Сонця коли-небудь ... і це врешті призвело до помилкового припущення, що "хороший громадянин Яви" повинен використовувати jul.
Хусі

4
@Huxi, я стверджую, що API API був гіршим. На захист Сонця це був не їхній код, але прийшов з Taglient.
Thorbjørn Ravn Andersen

22

Є один важливий момент, про який не згадувалося раніше:

SLF4J (і Logback, і LOG4J як резервний журнал) мають підтримку так званого діаграму діаграми Mapped (MDC, див. Javadoc та документацію ).

Це по суті локальна карта <String, String>, яку ви можете використовувати, щоб додати додаткову інформацію про контекст до події реєстрації. Поточний стан MDC додається до кожної події.

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


2
Технічно це локальна карта потоку <String, String>.
pdxleif

17

Дивіться також відповіді на запитання Які найкращі практики реєстрації помилки? , особливо:

  • Існує декілька можливих проблем із завантаженням класів із журналом Commons.

  • Log4J та SLF4J були розроблені однією і тією ж людиною, навчаючись з проблем, знайдених на практиці з Log4J.


4

У проекті нашої компанії ми використовуємо LOG4j, і це дуже просто, як показав Стівен у своєму прикладі. Ми також написали власні класи шаблонів для LOG4j, щоб ви могли створити власні схеми вихідних файлів. Ви можете описати, як повинен виглядати ваш файл журналу. Можна покращити оригінальні класи log4j.

Усі властивості LOG4j, які ви можете змінити у файлі log4j.properties, тому ви можете використовувати різні файли для різних проектів.

Реєстрація Java не є моїм фаворитом, але це може бути тому, що я використовую log4j з самого початку.


4

У огляді журналів Commons наведено причину його існування: ведення журналу з коду бібліотеки, коли ви не маєте контролю над базовою рамкою журналу. Дуже важливо для різних проектів Apache, які будуть пов'язані із зовнішніми додатками. Можливо, не так важливо для внутрішніх ІТ-проектів, де ви маєте повний контроль.

З цього приводу я пишу в Commons Logging, як і багато інших розробників, яких я знаю. Причина полягає в тому, щоб мінімізувати розумовий багаж: ви можете змінювати проекти або робочі місця, і не потрібно вивчати нові рамки (за умови, що нова робота / проект також використовує CL, та / або ви можете переконати їх перейти до нього).

Крім того, є деяка цінність у створенні власних обгортків навколо будь-якої основи, яку ви використовуєте. Як описано тут , мені подобається використовувати об’єкт LogWrapper, щоб забезпечити власну строфікацію (важливо) та мінімізувати візуальне скупчення операторів журналу (менш важливо).


1
Є також commons.logging => SLF4J міст, який може бути використаний для маршрутизації всіх реєстрацій CL через SLF4J. SLF4J підтримує з'єднання файлів commons.logging, LOG4J та (трохи громіздкі, але як можна краще) java.util.logging, щоб усі журнали опинилися в будь-якому бекенде SLF4J, який ви будете використовувати. Дивіться slf4j.org/legacy.html Я б використовував Logback, btw, але ви можете стверджувати, що я упереджений.
Хусі

2

Як правило, я б за замовчуванням використовував Log4J.

Я б використовував журнал Java, якщо я не заперечував залежність від Java 1.4, але все-таки я б користувався Log4J у перевазі.

Я використовував би Commons Logging, якби я вдосконалював щось, що вже використовував його.


Не заперечував залежність від 1,4 ?? Навіть 1.4 досягли кінця терміну служби.
Том Хотін - тайклін

2
@Tom Він означає, що jdk1.4 + не бути дурним.
мП.

Насправді я нещодавно провів деяку роботу в системі, яка все ще працювала під jdk 1.3 :-(, і це було менше двох років тому, коли я востаннє підтримував систему jdk 1.2 . Занадто багато місць не оновлюються, якщо їх абсолютно немає вони просто відмовляються встановлювати оновлення.
Michael Rutherfurd

0

Я б запропонував створити тонкий фасад журналу, який може записувати до будь-якої з каркасів реєстрації, і тоді вибір двигуна резервного копіювання стає суттєвим моментом.


2
Ось що робить загальнодоступний лісозаготівлі так, чому винаходити колесо? Також є деякі проблеми, з якими ваш фасад мав би вирішувати цю спільну реєстрацію.
Джеймс А.Н. Штауфер

+1 Щоб протистояти аргументу журналу обміну, Деякі додатки підприємств використовують користувальницький реєстратор. Це завжди гарна ідея, щоб приховати основну реалізацію. "Тонка" обгортка позбавляє від необхідності упаковки ще однієї банки і не стільки, скільки винаходити.
квестен

1
Це мене врятувало нещодавно, коли ми перенесли наш фреймворк до Compact Framework (у .Net). Якби у нас були жорсткі кодові залежності від nLog, нас би вкрутили. Оскільки ми застосували такий підхід, нам вдалося запустити нульовий реєстратор і бути щасливим. Хтось проголосує за мене до 0. Будь ласка :-)
Цимон

3
Одне вже існує - подивіться на slf4j. Це прийнята тонка обгортка, яка дозволяє перемикати рамки ведення журналу під час запуску програми, перемикаючи банки на клас маршруту виконання.
детермінація

1
засмічення має власний спосіб виявити, які рамки він буде використовувати - це не дуже приємно, а доволі конвулюовано. Скільки каркасів реєстрації створив Ceki. Завжди слід прагнути намітити рівень перенаправлення та приховати реалізацію, навіть якщо вона забита вашим власним журналом. За лаштунками ви зможете підключати будь-які ш / б ви хочете, як згадував Тревіс.
мП.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.