Преимущество log4j - PullRequest
       13

Преимущество log4j

11 голосов
/ 30 апреля 2010

В чем преимущество log4j перед установленными System.out и System.err для вывода в файл журнала?

Ответы [ 8 ]

13 голосов
/ 30 апреля 2010

На высоком уровне победа Log4j над ручным ведением журнала заключается в том, что вы можете отделить свой код регистрации от того, что вы действительно хотите регистрировать, и где и как вы хотите его регистрировать. Подробная информация о подробном ведении журнала / фильтрации, форматировании, расположении журнала и даже типе журнала (файлы, сеть и т. Д.) Обрабатывается декларативно с использованием конфигурации и расширяемым образом с помощью пользовательских приложений , скорее вам придется кодировать эту гибкость самостоятельно.

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

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

Кроме того, поскольку Log4j является де-факто стандартом для ведения журналов Java, доступно множество инструментов, которые могут делать классные вещи с помощью Log4j - кроме того, препятствуя вам и вашим операционным командам заново изобретать колесо.

Моя любимая функция - возможность легко писать приложениям, отправляющим данные в не-файловые источники, такие как SYSLOG , Splunk и т. Д., Что упрощает вход в приложение для вашего пользователя в инструменты управления операциями, которые уже используются вашим ИТ-отделом.

7 голосов
/ 30 апреля 2010

На самом деле, вы должны посмотреть на фасад slf4j в наши дни, так как он позволяет вам использовать {} -placeholder для самых кратких утверждений. Затем вы можете использовать соответствующую структуру ведения журналов за slf4j для обработки фактической обработки ваших операторов журнала. Это может быть log4j или slf4j-simple, который просто печатает все INFO, WARN и ERROR и отбрасывает остальные.

Важное замечание, которое вам необходимо сделать, заключается в том, что ЗАПИСЬ операторов лога выполняется при написании кода, а РЕШЕНИЕ того, что необходимо, выполняется при развертывании кода, что может занять годы после написания кода и испытания. System.out.println требует от вас физического изменения кода, чтобы избавиться от них, что недопустимо в жестком цикле записи-тестирования-развертывания. Если код изменяется, его необходимо повторно проверить. С slf4j вы просто активируете тех, кого хотите видеть.

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

Вы можете найти эту статью интересной. Целевая аудитория - начинающие программисты на Java, и я намерен с самого начала дать им хорошие привычки. http://runjva.appspot.com/logging101/index.html

1 голос
/ 25 октября 2012

Посмотрите, и вы поймете силу log4j:

log4j.properties Я использовал один раз для проекта:

# ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF

# No appenders for rootLogger 
log4j.rootLogger=OFF

folder=..
prefix=
fileExtension=.log
htmlExtension=${fileExtension}.html
datestamp=yyyy-MM-dd/HH:mm:ss.SSS/zzz
layout=%d{${datestamp}} ms=%-4r [%t] %-5p %l %n%m %n%n

# myLogger logger
log4j.logger.myLogger=ALL, stdout, infoFile, infoHtml, errorFile

# stdout 
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=${layout}
# infoFile 
log4j.appender.infoFile=org.apache.log4j.FileAppender
log4j.appender.infoFile.File=${folder}/${prefix}_info${fileExtension}
log4j.appender.infoFile.layout=org.apache.log4j.PatternLayout
log4j.appender.infoFile.layout.ConversionPattern=${layout}
# infoHtml 
log4j.appender.infoHtml=org.apache.log4j.FileAppender
log4j.appender.infoHtml.File=${folder}/${prefix}_info${htmlExtension}
log4j.appender.infoHtml.layout=org.apache.log4j.HTMLLayout
log4j.appender.infoHtml.layout.Title=Logs
log4j.appender.infoHtml.layout.LocationInfo=true
# errorFile 
log4j.appender.errorFile=org.apache.log4j.FileAppender
log4j.appender.errorFile.File=${folder}/${prefix}_error${fileExtension}
log4j.appender.errorFile.layout=org.apache.log4j.PatternLayout
log4j.appender.errorFile.layout.ConversionPattern=${layout}

# APPENDERS SETTINGS
log4j.appender.stdout.Threshold = ALL
log4j.appender.infoFile.Threshold = INFO
log4j.appender.infoHtml.Threshold = INFO
log4j.appender.errorFile.Threshold = WARN.

Чтобы изменить переменные в вашем Java-коде, вы можете сделать:

Загрузка конфигурации

Log4j автоматически загрузит конфигурацию, если она сохранена в файл с именем "log4j.properties" и присутствует в пути к классам в "" (например, WEB-INF / classes / log4j.properties).

Мне не нравится такой подход, и я предпочитаю загружать конфигурацию явно по телефону:

PropertyConfigurator.configure (Config.ETC + "/log4j.properties"); Таким образом, я могу перезагрузить конфигурацию в любое время, пока мой приложение все еще работает. Мне нравится добавлять кнопку в административный JSP, "Перезагрузить Log4J".

Расположение файла динамического журнала

Многие люди жалуются, что Log4j заставляет вас жестко кодировать местоположение где будут храниться ваши логи. На самом деле, это можно динамически выберите местоположение файла журнала, особенно если вы используете $ {log.dir} методика замены имущества выше. Вот как это сделать:

String dynamicLog = // log directory somehow chosen... 
Properties p = new Properties( Config.ETC + "/log4j.properties" ); 
p.put( "log.dir", dynamicLog ); // overwrite "log.dir" 
PropertyConfigurator.configure( p );
1 голос
/ 30 апреля 2010

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

1 голос
/ 30 апреля 2010

Log4j предлагает возможность вращать ваши файлы журнала в зависимости от размера и удалять их в зависимости от количества (logrotate), чтобы ваши серверы не заполняли свои диски. Лично я считаю, что это одна из наиболее ценных функций в Log4j.

Также Log4j популярен и понятен многим разработчикам. Последние три компании, в которых я работал, все использовали Log4j в большинстве проектов.

1 голос
/ 30 апреля 2010

Уровни, форматирование, ведение журнала для нескольких файлов ... Структура ведения журнала (даже если это java.util.logging) действительно полезна, если есть вероятность, что что-то может пойти не так, пока ваш код работает.

1 голос
/ 30 апреля 2010

мои любимые (не все)

  • Возможность установки параметров регистрации в конфиге, без перекомпиляции
  • Возможность задать способ записи журнала (из текстового файла в отправитель SMTP)
  • Возможность фильтрации по серьезности
0 голосов
/ 22 сентября 2017
  • ведение журнала (Документирование исторических бизнес-событий, которые происходят, вы можете проверить старые журналы)
  • отслеживать приложение (поток проекта)
  • отладка приложения (подробная информация о том, что происходит в методе на уровне детализации // данные, значение и все внутренние методы)
  • обработка ошибок (информация о конкретной возникшей ошибке)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...