Авторские права принадлежат автору Для любой формы перепечатки, пожалуйста, свяжитесь с автором для получения разрешения и укажите источник.
что такое журнал
Проще говоря, журнал предназначен для записи работы программы, что удобно для поиска ключевой информации, а также для быстрого обнаружения и решения проблем.
Наши Java-программисты полагаются на функцию отладки Debug инструментов разработки, таких как Eclipse/Idea, для отслеживания и устранения ошибок при разработке проектов.Это можно сделать в среде разработки, но как насчет проекта, выпущенного в тестовую и производственную среды? Вы можете сказать, что можете использовать удаленную отладку, но на самом деле это не позволяет.
Таким образом, функция журнала — это средство, с помощью которого разработчики и тестировщики могут обнаруживать проблемы, когда в тестовой и рабочей среде отсутствует средство отладки Debug. Если журнал написан хорошо, вы можете быстро найти и решить онлайн-проблемы в соответствии с траекторией журнала.Наоборот, если вывод журнала плохой, вы не сможете найти проблему и повлияете на производительность системы.
Отличные проекты умеют находить проблемы на основе логов, а не онлайн-отладки, или сумасшедшие, когда долго не могут найти полезные логи...
Общая структура ведения журнала
log4j, Logging, commons-logging, slf4j, logback, студенты, которые разрабатывают, не являются новичками в этих технологиях, связанных с журналами.Почему существует так много технологий ведения журнала, и каковы различия и связи между ними? Я считаю, что большинство людей не понимают их отношения, поэтому я буду представлять их по одному, чтобы вам больше не приходилось быть глупым, чтобы различать их.
Logging
Как показано на рисунке, это класс инструмента ведения журнала, поставляемый с Java, который был доступен, начиная с JDK 1.5, в пакете java.util.logging.
Дополнительные сведения о ведении журналов Java см.официальная документация
Log4j
Log4j — это фреймворк Apache с открытым исходным кодом для ведения журналов и фреймворк с наибольшей долей рынка. Большинство из них никогда не использовали Java Logging, но никто не осмеливается сказать, что они никогда не использовали Log4j. Во всяком случае, так было с тех пор, как я столкнулся с Java. Для Java-проектов должна быть структура ведения журналов Log4j.
Примечание. Apache объявил о прекращении технического обслуживания log4j 05.08.2015, и пользователям необходимо переключиться на Log4j2.
Вот официальное объявление:
On August 5, 2015 the Logging Services Project Management Committee announced that Log4j 1.x had reached end of life. For complete text of the announcement please see the Apache Blog. Users of Log4j 1 are recommended to upgrade to Apache Log4j 2.
commons-logging
Описанный выше log4j является реализацией определенной среды ведения журналов, в то время как commons-logging представляет собой интерфейс фасада журнала. Это также самый ранний интерфейс фасада журнала, предоставляемый apache. Пользователи могут выбирать различные структуры реализации журнала в соответствии со своими предпочтениями, не изменяя журнал. Это преимущество бревенчатого фасада в соответствии с программированием перед лицом абстракции интерфейса.
Для получения более подробной информации см.Официальное описание
Slf4j
Полное название: Simple Logging Facade for Java, то есть интерфейс Simple Logging Facade, который представляет собой ту же концепцию, что и Apache commons-logging. Они не являются конкретными платформами ведения журналов. Вы можете указать другие основные среды реализации ведения журналов.
Slf4j также является основным фреймворком фасада журнала.Использование Slf4j позволяет гибко использовать заполнители для размещения параметров, упростить код и улучшить читаемость, что будет обсуждаться позже.
Logback
Logback — это собственная структура реализации Slf4j.Он также создан Log4j, но имеет больше преимуществ, возможностей и более высокую производительность, чем log4j.Теперь он в основном используется для замены log4j и становится мейнстримом.
Почему Logback становится мейнстримом?
С точки зрения дизайна и реализации Logback имеет относительно много улучшений по сравнению с log4j. Но хотя перечислить их все сложно, вот несколько причин, по которым вам следует выбрать logback вместо log4j. Имейте в виду, что logback и log4j концептуально похожи в том смысле, что они были созданы одной и той же группой разработчиков. Поэтому, если вы уже знакомы с log4j, вы также можете очень быстро начать работу с logback. Если вам нравится использовать log4j, вы можете зацепиться за использование logback.
более быстрое выполнение
Основываясь на нашей предыдущей работе над log4j, logback переписал внутреннюю реализацию, и в некоторых конкретных сценариях он может быть даже в 10 раз быстрее, чем раньше. Обеспечивая более быструю работу компонентов журнала, требуется меньше памяти.
Для получения дополнительной информации см. «Причины перехода с Log4j на LogBack».
Сводная информация о структуре журналов
commons-loggin и slf4j — это просто фасад абстракции журнала, а не конкретная структура журнала. log4j и logback — это специальные фреймворки для реализации журналов. Общее предпочтение настоятельно рекомендуется использовать slf4j + logback. Конечно, вы также можете использовать два фреймворка комбинации журналов slf4j + log4j, commons-logging + log4j.
Как видно из рисунка выше, slf4j очень мощный, он может не только подключаться к различным фреймворкам журналов, но и интегрироваться с общими журналами фасадов журналов.
Подробный уровень журнала
Вывод журнала разделен на уровни, и разные журналы печатаются в разных случаях с разными настройками. В качестве описания уровня журнала возьмем наиболее часто используемый фреймворк логирования Log4j, который также является относительно полным, и другие фреймворки логирования аналогичны.
Класс уровня Log4j org.apache.log4j.Level определяет уровень журнала, а приоритет вывода журнала — следующие 8 типов от высокого до нижнего.
уровень журнала | описывать |
---|---|
OFF | Off: самый высокий уровень, журнал не выводится. |
FATAL | фатальный: вывести очень серьезную ошибку, которая может привести к завершению работы приложения. |
ERROR | Ошибка: вывод неверный, но приложение продолжает работать. |
WARN | ПРЕДУПРЕЖДЕНИЕ. Выходные данные могут быть потенциально опасными. |
INFO | Информация: вывод подробной информации о запущенном процессе приложения. |
DEBUG | Отладка: вывод более подробной информации, полезной для отладки приложения. |
TRACE | Отслеживание: вывод более подробного трека программы. |
ALL | Все: вывод всей информации об уровне. |
Таким образом, стандартный порядок уровней приоритета журнала таков:
ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF
Если для журнала установлено значение L , выходной журнал с уровнем P будет выводиться только в том случае, если P >= L .
То есть, если уровень журнала L установлен в INFO, только выходной уровень P является INFO или WARN, последующие журналы будут выводиться нормально.
Конкретное выходное отношение может относиться к следующему рисунку:
Зная уровень лога, это только основы Как понять спецификацию логирования, и как правильно логировать позу? !
Рекомендации по ведению журнала
Как я уже говорил в начале, лог нельзя перепутать, иначе он не будет играть той роли, которую должен играть лог, а также будет вызывать нагрузку на систему. У некоторых крупных компаний в BAT и Huawei есть требования к спецификациям журналов, а также есть спецификации того, когда какие журналы записывать.
В «Руководстве по разработке Java», выпущенном Ali в прошлом году, есть глава, посвященная спецификации журнала, и давайте рассмотрим, что это такое.
Ниже приведен протокол журнала Ultimate Edition «Руководство по разработке Java» Али.
Спецификации много, поэтому я не буду здесь вдаваться в подробности, полную окончательную версию можно получить, ответив на «Руководство» в паблике WeChat «Java Technology Stack». Я просто хочу сказать всем, что вход в большие компании строго регламентирован, а не только для того, чтобы вы случайно печатали.
Ali является интернет-компанией первого уровня, и разработанные ею спецификации журналов также соответствуют нашим требованиям и имеют большое справочное значение.Это действительно хорошо для популяризации этого протокола журналов Ali.
Как правильно войти в проект?
-
журнал правильного определения
private static final Logger LOG = LoggerFactory.getLogger(this.getClass());
Обычно у класса есть только один объект LOG.Если есть родительский класс, LOG может быть определен в родительском классе.
Тип переменной журнала определяется как фасадный интерфейс (например, Logger slf4j), а класс реализации может быть структурой реализации журнала, такой как Log4j и Logback. Не определяйте класс реализации как тип переменной, иначе переключение журнала будет неудобным и не соответствует идеям абстрактного программирования. -
Используйте параметризованную форму {} placeholder, [] для изоляции параметров
LOG.debug("Save order with order no:[{}], and order amount:[{}]");
Этот тип читабельности хорош, поэтому сразу видно, что [] — это динамический параметр вывода, {} используется для того, чтобы занимать место, аналогичное переменной привязки, и параметр будет обрабатываться только тогда, когда он действительно готов к печати, что удобно для определения проблемы.
Если структура журнала не поддерживает параметризованную форму, а вывод журнала не поддерживает уровень журнала, это приведет к избыточному созданию объектов и пустой трате памяти.В настоящее время вам необходимо использовать isXXEnabled для оценки, например:if(LOG.isDebugEnabled()){ // 如果日志不支持参数化形式,debug又没开启,那字符串拼接就是无用的代码拼接,影响系统性能 logger.debug("Save order with order no:" + orderNo + ", and order amount:" + orderAmount); }
По крайней мере, уровень отладки должен быть включен для суждения, а уровень онлайн-журнала должен быть как минимум выше информации. Рекомендуется использовать фасадный интерфейс SLF4J, который может выводить логи в параметризованном виде, а об уровне отладки не нужно судить по if, что упрощает код.
-
Вывод журналов разных уровней. Наиболее часто используемые уровни журналов в проектах — ERROR, WARN, INFO и DEBUG. Каковы сценарии применения этих четырех?
ОШИБКАОбычно он используется для записи любой информации об аномальной ошибке (Throwable), которая возникает в программе, или для записи ошибок бизнес-логики.
ПРЕДУПРЕЖДЕНИЕ (предупреждение)Обычно используется для записи некоторых ошибок параметров пользовательского ввода,
ИНФО (Информация)Это также самый низкий уровень журнала, который обычно используется, а также уровень журнала по умолчанию, который используется для записи некоторой полезной информации во время работы программы. Для такой информации, как начало, конец, трудоемкость и важные параметры программы, нужно обращать внимание на выборочный и содержательный вывод, в это время бессмысленно искать проблему и читать кучу логов, но не могу найти журнал ключей.
ОТЛАДКА (отладка)На этом уровне обычно записывается информация о некоторых промежуточных параметрах во время работы, и его разрешается включать только в среде разработки и, при необходимости, в тестовой среде.
Несколько неправильных методов регистрации
-
Не используй
System.out.print..
При выводе журнала журнал может быть выведен только через структуру журнала, а system.out.print.. не может использоваться для печати журнала.Это будет напечатано только на консоль tomcat, а не в файл журнала, который неудобно управлять логом.Если лог сбрасывается запуском сервисной формы, найти лог еще сложнее. -
Не используй
e.printStackTrace()
Во-первых, давайте посмотрим на его исходный код:public void printStackTrace() { printStackTrace(System.err); }
На самом деле он использует System.err для вывода на консоль tomcat.
-
Не создавать исключение, а затем выводить журнал Если пользовательское бизнес-исключение создается после того, как исключение было перехвачено, нет необходимости записывать журнал ошибок, и окончательный обработчик обрабатывает исключение. Вы не можете сгенерировать исключение и снова распечатать журнал ошибок, иначе журнал будет выводиться повторно.
try { // ... } catch (Exception e) { // 错误 LOG.error("xxx", e); throw new RuntimeException(); }
-
Не используйте конкретный класс реализации ведения журнала
InterfaceImpl interface = new InterfaceImpl();
Все ли понимают этот код? Объектно-ориентированное программирование должно быть ориентировано на интерфейс, а не на реализацию.Это также принцип шаблонов проектирования программного обеспечения, и правильный подход должен быть таким.Interface interface = new InterfaceImpl();
То же самое и во фреймворке лога.Как упоминалось выше, лог имеет фасадный интерфейс и специфический фреймворк реализации, поэтому программировать на реализацию всем не стоит. -
Выводятся не все сообщения об ошибках Глядя на следующий код, он не будет записывать подробную информацию об исключении стека, а будет записывать только основное описание ошибки, что не способствует устранению неполадок.
try { // ... } catch (Exception e) { // 错误 LOG.error('XX 发生异常', e.getMessage()); // 正确 LOG.error('XX 发生异常', e); }
-
Не используйте неправильный уровень журнала Однажды я нашел проблему в Интернете, и мой коллега уверенно сказал мне: я четко вывожу лог, почему я не могу его найти... Позже я посмотрел его код, который выглядит так:
try { // ... } catch (Exception e) { // 错误 LOG.info("XX 发生异常...", e); }
Вы видели какие-либо проблемы? Используйте информацию для записи журнала ошибок, журнал выводится в файл журнала информации, как мои коллеги могут отчаянно найти его в файле журнала ошибок?
-
Не печатать журналы в цикле Мелалеуки Что это значит, если ваш фреймворк использует фреймворк Log4j с низкой производительностью, то не печатайте логи тысячами циклов for, это может затянуть ваше приложение, если замедляется время отклика вашей программы, то подумайте, печатается ли лог перебор.
for(int i=0; i<2000; i++){ LOG.info("XX"); }
Лучший способ — записать основные моменты в цикле и распечатать сводку вне цикла.
-
Отключить отладку в онлайн-среде Это последний и самый важный пункт. Во-первых, в самом проекте слишком много журналов отладки, а во-вторых, различные фреймворки также используют много журналов отладки.Когда отладка включена онлайн, диск скоро будет заполнен, что повлияет на нормальную работу бизнес-системы. .