Чому б один із наведених пакунків використовував замість іншого?
- Реєстрація Java
- Commons Ведення журналів
- Log4j
- 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 + ".");
}
Я вважаю, що ведення журналу на Java є заплутаним, непослідовним, погано задокументованим та особливо небезпечним. Більше того, між цими рамками ведення журналів існує величезна схожість, що призводить до дублювання зусиль та плутанини щодо того, в якому середовищі ведення журналу ви перебуваєте насправді. Зокрема, якщо ви працюєте в серйозному стеку веб-додатків Java, ви часто знаходитесь у кратніведення ведення ведення ведення журналу за один раз; (наприклад, сплячий може використовувати log4j та tomcat java.util.logging). Apache commons призначений для з'єднання різних фреймворків, але насправді лише додає більше складності. Якщо ви цього не знаєте достроково, це надзвичайно дивовижно. Чому мої повідомлення журналу не друкуються на консоль тощо? О, тому що я дивлюся на журнали Tomcat, а не log4j. Додаючи ще один рівень складності, сервер додатків може мати глобальні конфігурації журналу, які можуть не розпізнавати локальні конфігурації для конкретного веб-додатку. Нарешті, усі ці рамки ведення журналу ЛІГО ЗАВЕРШЕНІ. Вхід у Java був неорганізованим безладом, і такі розробники, як я, розчарувались і розгублені.
Ранні версії Java не мали вбудованої системи реєстрації журналів, що вела б до цього сценарію.
Є один важливий момент, про який не згадувалося раніше:
SLF4J (і Logback, і LOG4J як резервний журнал) мають підтримку так званого діаграму діаграми Mapped (MDC, див. Javadoc та документацію ).
Це по суті локальна карта <String, String>, яку ви можете використовувати, щоб додати додаткову інформацію про контекст до події реєстрації. Поточний стан MDC додається до кожної події.
Це може бути надзвичайно корисно, якщо ви вкладете в нього такі речі, як ім’я користувача та URL-адреса запиту (у випадку веб-перегляду). Це можна зробити автоматично, наприклад, за допомогою фільтра.
Дивіться також відповіді на запитання Які найкращі практики реєстрації помилки? , особливо:
Існує декілька можливих проблем із завантаженням класів із журналом Commons.
Log4J та SLF4J були розроблені однією і тією ж людиною, навчаючись з проблем, знайдених на практиці з Log4J.
У проекті нашої компанії ми використовуємо LOG4j, і це дуже просто, як показав Стівен у своєму прикладі. Ми також написали власні класи шаблонів для LOG4j, щоб ви могли створити власні схеми вихідних файлів. Ви можете описати, як повинен виглядати ваш файл журналу. Можна покращити оригінальні класи log4j.
Усі властивості LOG4j, які ви можете змінити у файлі log4j.properties, тому ви можете використовувати різні файли для різних проектів.
Реєстрація Java не є моїм фаворитом, але це може бути тому, що я використовую log4j з самого початку.
У огляді журналів Commons наведено причину його існування: ведення журналу з коду бібліотеки, коли ви не маєте контролю над базовою рамкою журналу. Дуже важливо для різних проектів Apache, які будуть пов'язані із зовнішніми додатками. Можливо, не так важливо для внутрішніх ІТ-проектів, де ви маєте повний контроль.
З цього приводу я пишу в Commons Logging, як і багато інших розробників, яких я знаю. Причина полягає в тому, щоб мінімізувати розумовий багаж: ви можете змінювати проекти або робочі місця, і не потрібно вивчати нові рамки (за умови, що нова робота / проект також використовує CL, та / або ви можете переконати їх перейти до нього).
Крім того, є деяка цінність у створенні власних обгортків навколо будь-якої основи, яку ви використовуєте. Як описано тут , мені подобається використовувати об’єкт LogWrapper, щоб забезпечити власну строфікацію (важливо) та мінімізувати візуальне скупчення операторів журналу (менш важливо).
Як правило, я б за замовчуванням використовував Log4J.
Я б використовував журнал Java, якщо я не заперечував залежність від Java 1.4, але все-таки я б користувався Log4J у перевазі.
Я використовував би Commons Logging, якби я вдосконалював щось, що вже використовував його.
Я б запропонував створити тонкий фасад журналу, який може записувати до будь-якої з каркасів реєстрації, і тоді вибір двигуна резервного копіювання стає суттєвим моментом.