Чи повинні нові проекти використовувати logback замість log4j? [зачинено]


78

Чи повинні нові проекти використовувати logback замість log4j як структуру ведення журналу?

Або іншими словами: "Чи кращий журнал, ніж log4j (залишаючи поруч SLF4J-'особливість 'ретробеку)?'


Чи не могли б ви розширити питання, чому це питання було закрито?
James McMahon

13
Це питання мені корисно, голосуючи за відновлення.
Ерік Вілсон,

3
Як, по суті, це "занадто локалізовано?" Величезна кількість java-проектів використовує log4j. Питання про те, чи слід вважати його "застарілим" на користь новішого журналу (автори якого, схоже, вважають, що воно припиняє log4j), є актуальним для багатьох людей і буде продовжуватись деякий час.
EricS

Проголосували за повторне відкриття, але, схоже, присутній лише мій один голос.
skiphoppy

Проголосував також за повторне відкриття; Я припускаю, що його локалізовано на "java", і це досить добре: /
Пол Грегуар,

Відповіді:


83

Для реєстрації слід використовувати SLF4J + Logback.

Він надає чудові функції, такі як параметризовані повідомлення та (на відміну від загальних журналів) відображений діагностичний контекст (MDC, javadoc , документація ).

Використання SLF4J робить протокол реєстрації доступним для обміну досить елегантно.

Крім того, SLF4J підтримує мостування інших фреймворків ведення журналу до фактичної реалізації SLF4J, яку ви будете використовувати, щоб події реєстрації від сторонніх програм відображатимуться у ваших уніфікованих журналах - за винятком java.util.logging, який неможливо перетворити на так само, як і інші фреймворки журналювання.

Перехідний липень пояснюється в javadocs з SLF4JBridgeHandler.

Я мав дуже хороший досвід використання комбінації SLF4J + Logback у кількох проектах, і розробка LOG4J майже затрималася.

SLF4J має наступні недоліки:

  • Він не підтримує varargs, щоб залишатися сумісними з Java <1.5
  • Він не підтримує використання параметризованих повідомлень і винятків одночасно.
  • Він не містить підтримки вкладеного діагностичного контексту (NDC, javadoc ), який має LOG4J.

4
LOL, я щойно отримав значок Necromancer за цю відповідь! Дякую всім виборцям;) Я ніколи не очікував отримати його ...
Хусі,

Накладений діагностичний контекст є потужнішою альтернативою вкладеному діагностичному контексту
Гаел Марціо

1
Це не зовсім так. Вони насправді є ортогональними поняттями. MDC - це карта, тоді як NDC - це стек. Погляньте на sourceforge.net/apps/trac/lilith/wiki/NestedDiagnosticContext для деяких прикладів використання.
Huxi

4
Я так і не з’ясував, чому MDC та NDC називають так, як їх називають, а не щось легше запам’ятовувати. Зітхайте.
Thorbjørn Ravn Andersen

1
@Huxi, "Карта" та "Стек", можливо?
Thorbjørn Ravn Andersen

22

Автор (як Logback, так і Log4j) має перелік причин для зміни на http://logback.qos.ch/reasonsToSwitch.html .

Ось кілька, що стирчали в мене;

  • Швидше впровадження

    На підставі нашої попередньої роботи над log4j, внутрішні дані журналу перепису були переписані, щоб виконувати приблизно в десять разів швидше на певних критичних шляхах виконання. Компоненти реєстрації не тільки швидші, вони також мають менший розмір пам'яті.

  • Автоматичне перезавантаження файлів конфігурації

    Logback-classic може автоматично перезавантажувати свій файл конфігурації після модифікації. Процес сканування є швидким і безпечним, оскільки не передбачає створення окремого потоку для сканування. Ця технічна тонкощі гарантує, що ретробек відтворюється добре на серверах додатків і, загалом, у середовищі JEE.

  • Стек стеків з даними упаковки

    Коли журнал друкує виняток, трасування стека включатиме дані упаковки. Ось зразок трасування стека, згенерований веб-додатком logback-demo.

    14: 28: 48.835 [btpool0-7] ІНФОРМАЦІЯ cqldemo.prime.PrimeAction - 99 не є дійсним значенням java.lang.Exception: 99 недійсне
    у ch.qos.logback.demo.prime.PrimeAction.execute (PrimeAction.java : 28) [класи /: na] на org.apache.struts.action.RequestProcessor.processActionPerform (RequestProcessor.java:431) [struts-1.2.9.jar: 1.2.9] на org.apache.struts.action. RequestProcessor.process (RequestProcessor.java:236) [struts-1.2.9.jar: 1.2.9] на org.apache.struts.action.ActionServlet.doPost (ActionServlet.java:432) [struts-1.2.9.jar : 1.2.9] на javax.servlet.http.HttpServlet.service (HttpServlet.java:820) [servlet-api-2.5-6.1.12.jar: 6.1.12]
    на org.mortbay.jetty.servlet.ServletHolder.handle (ServletHolder.java:502) [jetty-6.1.12.jar: 6.1.12] на ch.qos.logback.demo.UserServletFilter.doFilter (UserServletFilter.java:44 ) [класи /: na] на org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter (ServletHandler.java:1115) [jetty-6.1.12.jar: 6.1.12] на org.mortbay.jetty.servlet. ServletHandler.handle (ServletHandler.java:361) [jetty-6.1.12.jar: 6.1.12] на org.mortbay.jetty.webapp.WebAppContext.handle (WebAppContext.java:417) [jetty-6.1.12.jar : 6.1.12] на org.mortbay.jetty.handler.ContextHandlerCollection.handle (ContextHandlerCollection.java:230) [jetty-6.1.12.jar: 6.1.12]

    З вищесказаного ви можете зрозуміти, що програма використовує Struts версії 1.2.9 і була розгорнута під версією версії 6.1.12. Таким чином, сліди стеків швидко повідомлятимуть читача про класи, що входять у виняток, а також про версії пакета та пакунку, до яких вони належать. Коли ваші клієнти надсилають вам стек стека, як розробнику вам більше не потрібно буде просити їх надсилати вам інформацію про версії пакетів, які вони використовують. Інформація буде частиною трасування стека. Докладніше див. У слові перетворення "% xThrowable".

    Ця функція може бути дуже корисною до того, що деякі користувачі помилково вважають її особливістю своєї IDE.

  • Автоматичне видалення старих архівів журналів

    Встановивши властивість maxHistory для TimeBasedRollingPolicy або SizeAndTimeBasedFNATP, ви можете контролювати максимальну кількість заархівованих файлів. Якщо ваша політика прокатки вимагає щомісячного переходу, і ви хочете зберегти журнали на один рік, просто встановіть для властивості maxHistory значення 12. Архівовані файли журналів, старші за 12 місяців, будуть автоматично видалені.

Там може бути упередження, але той самий хлопець написав обидва фреймворки, і якщо він каже, використовуйте Logback через Log4j, мабуть, варто послухати.


1
Зверніть увагу, що автор має особисті причини, через які бажає, щоб люди перейшли на інший перелік, тому список не є абсолютно неупередженим.
Thorbjørn Ravn Andersen

@ ThorbjørnRavnAndersen Які особисті причини? Це проект з відкритим кодом.
Kshitiz Sharma

Це довга історія. Я пропоную вам відкрити нове запитання, якщо ви дійсно хочете знати.
Thorbjørn Ravn Andersen

10

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

Для мене це виявилося дуже цінним. Це дозволяє мені використовувати log4j у старих JVM, та logback у 1.5+ JVM, а також java.util.logging за потреби.


2

Повторний звіт про Java EE:
загалом (від коду до документації) пам’ятайте про контейнери - як співіснують декілька програм, як реалізовані завантажувачі класів тощо.

від потенційного розробника майже однаково, Logback додає параметризоване ведення журналу (не потрібно використовувати if (logger.isDebugEnabled ()), щоб уникнути накладних витрат на конкатенацію рядків)

Log4j - єдиний гігантський плюс - це стара підтримка JVM, невеликий (IMO) NDC (MDC), деякі розширення. Наприклад, я написав розширення для configureAndWatch для Log4j, такого для Logback немає


1

оригінал log4j та logback були розроблені та реалізовані тим самим хлопцем.

кілька інструментів з відкритим кодом використовували SLF4J. Я не бачу суттєвих недоліків у цьому інструменті. Отже, якщо у вас немає багато розширень для log4j у вашій кодовій базі, я хотів би продовжити з реєстрацією.


1

Я вважаю, що ваше рішення повинно звестись до того самого, яке було б, якби ви вирішили між використанням log4j або Джакарта Commons Logging - ви розробляєте бібліотеку, яка буде включена в інші програми? Якщо так, то здається нечесним змушувати користувачів вашої бібліотеки також використовувати вибрану вами бібліотеку журналів.

Якщо відповідь негативна, я б просто погодився з тим, що простіше додати, і чим вам комфортніше. Здається, що зворотний зв’язок настільки ж розтяжний і надійний, як і log4j, тому, якщо вам зручно його використовувати, продовжуйте.


2
Якщо ви розробляєте бібліотеку, використовуйте slf4j, оскільки вона може використовувати будь-який серверний сервіс без мінусів спільного журналювання. Якщо ви пишете програму, використовуйте slf4j, щоб ви могли використовувати зворотний звіт.
Девід Руссель,

-3

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

По-перше, чому ви виключаєте інструмент з експертизи? Я думаю, що важливо зберігати відкритість і вивчити всі можливості, щоб вибрати найкращу.

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

Відповісти на ваше запитання - так і ні. Це залежить від проекту та наскільки команда знайома з одним інструментом. Я б не сказав "не використовуй log4j", якщо вся команда дуже комфортно з ним працює, він відповідає всім потребам, а logback не пропонує нічого, що нам потрібно для виконання завдання.


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

Ага. Дякую за роз'яснення, але основні моменти моєї відповіді все ж застосовуються.
Thomas Owens,

16
Оце Так! Поговоріть про неоднозначне ... замініть log4jі logbackв цій відповіді будь-які дві бібліотеки, мови, середовища розробки і т.д. і побачите результат! це дивовижно! : D
Пабло Фернандес
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.