На что следует обратить внимание при входе в код Java?

Java

Зачем журнал?

Что такое журнал? Журнал — это некоторые данные и записи, которые вы распечатываете во время работы кода, это хороший помощник для быстрого устранения неполадок.Это мощный инструмент для разрывания и метания горшков!

Прежде чем что-то делать, подумайте, зачем. Зачем нам нужно вести журнал, когда мы разрабатываем? Причина очень проста: никто не может гарантировать, что программы, которые они пишут, свободны от ошибок, даже если вы проводите достаточное количество тестов, вы можете только уменьшить вероятность ошибок.

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

Так что, конечно, такие хорошие вещи от более поздних поколений Fuze будут использоваться~

Фреймворк ведения журналов Java

Чтобы говорить о структуре журналирования Java, мы должны начать до JDK 1.3 в древние времена. В то время все выводили журнал прямо в поток STDOUT или STDERR.

System.out.println()
System.err.println()
e.printStackTrace()

Итак, log4j находится в Дэниеле.CekiПосле серии разработок, а также событий поедания дыни Ceki и Apache, он постепенно превратился в три самых популярных фреймворка для ведения журналов: slf4j, logback и log4j2.

  • slf4j: «Фасадная» структура журнала, пока пользователь использует интерфейс, предоставляемый SLF4J, конкретная реализация журнала может быть скрыта.
  • logback: Как и slf4j, он был создан для Ceki God, поэтому slf4j реализован изначально, фреймворк ведения журнала по умолчанию, назначенный Spring Boot.
  • log4j2: проект верхнего уровня Apache с более высокой производительностью, чем журналирование, особенно асинхронный вывод, который работает лучше.

PS: 4j означает для Java, что является очень распространенным методом именования в проектах с открытым исходным кодом Java.

Итак, теперь основной фреймворк — это slf4j + logback или slf4j + log4j2.

В руководстве по разработке Alibaba первым пунктом протокола журнала является то, что приложение не может напрямую использовать API в системе ведения журнала (Log4j, Logback), но должно полагаться на API в структуре ведения журнала (SLF4J, JCL — Jakarta Commons). ведение бревен), использование бревенчатого каркаса фасадного режима способствует ведению и унификации методов обработки бревен различных классов.

Как выбрать уровень логирования?

Что касается уровней ведения журналов, в разных стандартах используются разные определения. Поскольку slf4j почти доминировал в мире, мы в основном вводим пять уровней логирования, определяемых slf4j.

5种日志级别
5 уровней логирования

Пять уровней ERROR, WARN, INFO, DEBUG и TRACE расположены от высокого к низкому."Чем выше уровень конфигурации, тем меньше вывод журнала".

Когда мы настраиваем вывод журнала определенного уровня, он также будет выводить журнал более высокого уровня, чем он. Например, если мы настроим журнал на уровне INFO, он выведет три уровня журналов: ERROR, WARN и INFO.

Как следует из названия, эти уровни журналов будут выводить информацию разного уровня:

  • ОШИБКА: журнал ошибок, серьезная ошибка, влияющая на нормальную работу;
  • ПРЕДУПРЕЖДЕНИЕ: журнал предупреждений, общая ошибка, незначительное влияние на бизнес;
  • INFO: Информационный журнал, который записывает некоторые ежедневные вещи, такие как время звонка, входные и выходные параметры, бизнес-информация и т. д.;
  • DEBUG: данные времени выполнения в ключевой логике для DEBUG;
  • TRACE: Самая подробная информация, как правило, эта информация записывается только в лог-файл.

PS: По опыту автора, использование уровня TRACE относительно невелико. log4j рекомендует только первые 4 уровня.

наследование уровней

Иногда мы можем выводить журналы разного уровня в зависимости от бизнеса. Например, некоторые важные сервисы выводят логи уровня INFO, другие сервисы выводят логи уровня WARN, и в то же время закрывают логи всех библиотек и фреймворков, таких как Spring.

日志级别继承
наследование на уровне журнала

В общем случае нам нужно установить только корневой уровень, если для какого-то бизнеса есть особые требования, достаточно настроить конкретные пакеты. Здесь стоит упомянуть, что целесообразно включить низкоуровневое ведение журнала, особенно на корневом уровне. Я слышал ошибку раньше, просто для отладки проблемы, журнал DEBUG был включен в производственной среде, и это было на корневом уровне, из-за чего огромное количество журналов печаталось в одно мгновение, и диск не мог поддерживать его, вызывая производственную аварию.

logging:
  level:
    org:
      springframework:
        orm: DEBUG
        transaction: DEBUG
    root: INFO

Меры предосторожности

переключить суждение

В мануале по Java-разработке Али есть такая оговорка:

[Обязательно]: для вывода журнала уровня трассировки/отладки/информации необходимо выполнить оценку переключения уровня журнала.

То есть, когда уровень журнала относительно низок, перед записью следует добавить суждение."Уменьшите ненужные накладные расходы на вызов метода". Например:

// 打日志的业务代码
User user = new User(1L, "username", "pwd");
log.debug("userId is: {}", user.getId());
return user;

// user.getId()实现
public long getId() {
    System.out.println("调用了getId()");
    return id;
}

Приведенный выше код, когда я играю в журнал отладки, вызываетuser.getId()метод, на данный момент, даже если мы настроим только журнал уровня INFO, при запуске этого кода он все равно будет вызыватьсяuser.getId()метод, вызывающий ненужные накладные расходы.

Эту проблему можно решить, если мы добавим суждение впереди:

User user = new User(1L, "username", "pwd");
if (log.isDebugEnabled()) {
    log.debug("userId is: {}", user.getId());
}
return user;

Конечно, это зависит от вашего собственного проекта."Если развертывание вашего проекта определенно включает журналы уровня INFO, то журналы уровня INFO можно оценивать безоговорочно.".

Используйте параметры заполнителей

В приведенном выше примере мы использовали фигурные скобки{}в качестве заполнителя в журнале. по сравнению с использованием+Оператор выполняет конкатенацию строк, а использование заполнителей может сделать наш код более элегантным и лаконичным.

Кроме того, при объединении строк String будет использоватьсяStringBuildeрappend()метод, есть определенная потеря производительности. Использование заполнителей — это просто замена действия, которое может эффективно повысить производительность.

Чем больше логов, тем лучше?

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

Что нам нужно понять, так это то,"Нам нужен не лог, а валидный лог". Более того, если будет слишком много недействительных журналов, это будет стоить диска~

Просто напечатайте ключевую информацию, на которой мы сосредоточимся. Чаще используется уникальный идентификатор, по которому мы обычно можем быстро найти данные, например gid.

Синхронный против асинхронного

Мы знаем, что журнал в конечном итоге будет выводиться в файл или другой поток вывода, который будет интенсивно использовать ввод-вывод. Асинхронный может значительно улучшить производительность ввода-вывода, поэтому, если нет особых требований, обычно рекомендуется использовать асинхронный режим для вывода логов.

Возьмем в качестве примера logback, настроить асинхронность очень просто, используйтеAsyncAppenderПросто делать:

<!--配置异步日志-->
<appender name="FILE_ASYNC" class="ch.qos.logback.classic.AsyncAppender">
    <appender-ref ref="ASYNC"/>
</appender>

trace Id

Современные системы становятся все больше и сложнее. Разделение интерфейсной и серверной части и распределенная архитектура делают устранение неполадок и отслеживание ссылок вызовов все более и более сложными. Чтобы решить эту проблему, мы можем использовать идентификатор трассировки для идентификации полной цепочки вызовов.

Текущие основные платформы ведения журналов уже имеют эту поддержку. Возьмем, к примеру, logback, он предоставляет механизм MDC, MDC — это «сопоставленный диагностический контекст» (сопоставленный диагностический контекст), конкретная реализацияorg.sl4j.MDCэтот класс. В этой статье мы не будем подробно описывать, как им пользоваться, заинтересованные студенты могут обратиться к официальной документации.

разделение файла журнала

Мы печатаем журнал, чтобы получить некоторую информацию, которая нам нужна. Таким образом, мы можем выделить различные типы журналов, такие как журнал доступа или журнал уровня ОШИБКИ, которые можно распечатать в файл отдельно.

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

Получить экземпляр журнала

Студенты, которые использовали структуру журнала, имеют более или менее определенные экземпляры журнала в классе. Однако, по наблюдению автора, у всех разные способы определения бревна. Некоторые из них называются log, некоторые — logger, а некоторые — LOGGER. Определение также более произвольное, например, не добавлениеstatic, не добавляйтеfinal, передается при получении экземпляраthisДа, тоже входящие.classиз.

Здесь я должен упомянуть отличную аннотацию Ломбока:@Slf4j. Он может автоматически внедрить экземпляр журнала в соответствии с вашим классом, что очень удобно и быстро.Если ваш проект использует Lombok, вы также можете использовать его. Неважно, используете ли вы Lombok, вы можете обратиться к тому, как он определяется:

@Slf4j
public class Demo {

} // 等价于: public class Demo { private static final Logger log = LoggerFactory.getLogger(Demo.class); }

Выше, каждый может счастливо войти ~

关于作者
Об авторе
Категории