logback log [10 минут на освоение]

Java

введение

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

теги конфигурации logback

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

  • configurationЭтикетка

configurationВ разделе есть 3 элемента конфигурации

<configuration scan="true" scanPeriod="60 seconds" debug = "true">

scan="true"Указывает, что конфигурация динамической загрузки включена,scanPeriodИспользуется для настройки времени динамической загрузки, если не указаноscan,scanPeriodдефолтscan="true" scanPeriod="60 seconds", настроитьdebug = "true"Включите журнал отладки logback, который не включен по умолчанию.

  • propertyЭтикетка

propertyдля объявления переменных

<property name="CHARSET" value="UTF-8"/>

Logback также поддерживает чтение элементов конфигурации в файлах конфигурации spring, доступ к которым можно получить черезspringPropertyчитать

    <springProperty scope="context" name="springAppName"
                    source="spring.application.name" />
  • appenderЭтикетка

appenderэто компонент, который выводит события журнала

 <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${PATTERN}</pattern>
            <charset>${CHARSET}</charset>
        </encoder>
    </appender>

общийappenderимеют:
ConsoleAppenderДобавить события журнала в консоль
FileAppenderВывод событий журнала в файл
RollingFileAppenderПоверните файл журнала, когда файл журнала соответствует условиям, выведите журнал в другой файл

  • loggerЭтикетка

loggerИспользуется для установки уровня пакета или класса и указанияappender

  <logger name="errorLogger" additivity ="true" level="ERROR">
     <appender-ref ref="errorAppender" />
 </logger>

additivityЗаявление до высшегоloggerПройти информацию о печати, значение по умолчанию верно;appender-refУкажите компонент вывода журнала, можно настроить несколько

  • rootЭтикетка
<root level="INFO">
     <appender-ref ref="STDOUT"/>
 </root>

rootЯрлыки всеloggerвысший, если низшийappenderуказанныйadditivity="true", Нижний уровеньappenderВывод будет вrootобъявлено вappenderвоплощенный в

упражняться

Перейти непосредственно к последней полностью доступной конфигурации

  <?xml version="1.0" encoding="UTF-8"?>
<configuration>

   <springProperty scope="context" name="springAppName"
                   source="spring.application.name" />
   <springProperty scope="context" name="springActive"
                   source="spring.profiles.active" />
   <property name="CHARSET" value="UTF-8"/>
   <property name="SAVE_PATH" value="/data/logs/${springAppName}"/>
   <property name="PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %X{trackId} [%15.15t] %class{39}.%method[%L] : %m%n"/>
   <if condition='property("springActive").equals("prod")'>
       <then>
           <property name="maxHistory" value="7"/>
       </then>
       <else>
           <property name="maxHistory" value="3"/>
       </else>
   </if>
   <property name="maxFileSize" value="200MB"/>
   
   <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
       <encoder>
           <pattern>${PATTERN}</pattern>
           <charset>${CHARSET}</charset>
       </encoder>
   </appender>
   
   <appender name="digestAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
       <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
           <level>INFO</level>
       </filter>
       <file>${SAVE_PATH}/${springAppName}-digest.log</file>
       <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
           <fileNamePattern>${SAVE_PATH}/digest/${springAppName}-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
           <maxHistory>${maxHistory}</maxHistory>
           <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
               <maxFileSize>${maxFileSize}</maxFileSize>
           </timeBasedFileNamingAndTriggeringPolicy>
       </rollingPolicy>
       <encoder>
           <pattern>${PATTERN}</pattern>
           <charset>UTF-8</charset>
       </encoder>
       <append>true</append>
   </appender>
   
   <appender name="bizAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
       <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
           <level>INFO</level>
       </filter>
       <file>${SAVE_PATH}/${springAppName}-biz.log</file>
       <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
           <fileNamePattern>${SAVE_PATH}/biz/${springAppName}-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
           <maxHistory>${maxHistory}</maxHistory>
           <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
               <maxFileSize>${maxFileSize}</maxFileSize>
           </timeBasedFileNamingAndTriggeringPolicy>
       </rollingPolicy>
       <encoder>
           <pattern>${PATTERN}</pattern>
           <charset>UTF-8</charset>
       </encoder>
       <append>true</append>
   </appender>
   
    <appender name="statAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
       <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
           <level>INFO</level>
       </filter>
       <file>${SAVE_PATH}/${springAppName}-stat.log</file>
       <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
           <fileNamePattern>${SAVE_PATH}/stat/${springAppName}-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
           <maxHistory>${maxHistory}</maxHistory>
           <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
               <maxFileSize>${maxFileSize}</maxFileSize>
           </timeBasedFileNamingAndTriggeringPolicy>
       </rollingPolicy>
       <encoder>
           <pattern>${PATTERN}</pattern>
           <charset>${CHARSET}</charset>
       </encoder>
       <append>true</append>
   </appender>
   
   <appender name="errorAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
       <file>${SAVE_PATH}/${springAppName}-error.log</file>
       <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
           <fileNamePattern>${SAVE_PATH}/error/${springAppName}-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
           <maxHistory>${maxHistory}</maxHistory>
           <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
               <maxFileSize>${maxFileSize}</maxFileSize>
           </timeBasedFileNamingAndTriggeringPolicy>
       </rollingPolicy>
       <encoder>
           <pattern>${PATTERN}</pattern>
           <charset>${CHARSET}</charset>
       </encoder>
       <filter class="ch.qos.logback.classic.filter.LevelFilter">
           <level>ERROR</level>
           <onMatch>ACCEPT</onMatch>
           <onMismatch>DENY</onMismatch>
       </filter>
       <append>true</append>
   </appender>
   
    <logger name="digestLogger" additivity ="true">
       <appender-ref ref="digestAppender" />
   </logger>
   <logger name="bizLogger" additivity ="true">
       <appender-ref ref="bizAppender" />
   </logger>
   <logger name="statLogger" additivity ="true">
       <appender-ref ref="statAppender" />
   </logger>
   <logger name="errorLogger" additivity ="true" level="ERROR">
       <appender-ref ref="errorAppender" />
   </logger>
     <logger name = "cn.sleeper" level = "DEBUG"/>

<root level="INFO">
       <appender-ref ref="STDOUT"/>
   </root>
</configuration>
   

объяснять

Настройте, как указано выше

  • springPropertyПолучите имя приложения из файла конфигурации spring, чтобы назвать журнал, получитеspring.profiles.activeПараметры используются для различения среды выполнения

  • propertyОпределенныйCHARSETИспользуется для указания кодов дней, определенийSAVE_PATHИспользуется для указания пути хранения отчета и определения файла журнала.PATTERNУкажите формат журнала, определениеmaxHistoryФайлы журнала отказа от ответственности хранят количество дней,maxFileSizeУкажите максимальную емкость каждого лог-файла, это нужно указать, используется logback<if condition...мнение, нужно добавитьjaninoЗависимость, см. следующее:

     <dependency>
             <groupId>org.codehaus.janino</groupId>
             <artifactId>janino</artifactId>
             <version>2.6.1</version>
     </dependency>
    
  • appender

(1)STDOUTТип приложенияConsoleAppender, в качестве вывода консоли укажите формат журнала вывода консоли и тип кодировки
(2)bizAppenderТип приложенияRollingFileAppender, вывод в виде бизнес-журнала
(3)digestAppenderТип приложенияRollingFileAppender, как вывод сводного журнала
(4)statAppenderТип приложенияRollingFileAppenderКак вывод журнала статистики
(5)errorAppenderТип приложенияRollingFileAppender, как вывод журнала исключений
в каждом из перечисленныхappenderОпределенный<level>уровень печати журнала, используйтеTimeBasedRollingPolicyОпределите стратегию ротации файлов журнала, укажите имя файла журнала, максимальное время хранения и максимальный размер файла. <encoder>Определите формат журнала, журнал кодировки,errorAppenderиспользоватьLevelFilterфильтрERRORжурнал уровней, всеERRORуровень журнала доerrorAppenderобработка, неINFOЖурналы уровней будут отфильтрованы и использованы другими приложениями.ThresholdFilterЗначения конфигурации фильтра нижеINFOжурнал уровней

  • logger

для каждого определенногоappender, который определяет соответствующийlogger,использоватьappender-refАссоциация, удобная для разбиения лога в коде,additivity="true"Указывает, что журнал будет отправлен обратно в корень, а корень определяет приложение вывода консоли, то есть вloggerобъявленadditivity="true"Не только будет<logger>сам в аппендер записывается в файл, а так же выводится в консоль

  • root

levelзаданный уровень печатиappender-refуказанный вывод на консоль дляConsoleAppender

Эффект

В сочетании с вышеуказанным файлом конфигурации мы определяем несколькоlogger, Таким образом, при использовании необходимо регистрировать уровень инкапсуляции, чтобы его можно было определить в вызове при вызове соответствующего хорошегоappenderкомпоненты

public interface LogApi {
    Logger dlog = LoggerFactory.getLogger("digestLogger");
    Logger blog = LoggerFactory.getLogger("bizLogger");
    Logger slog = LoggerFactory.getLogger("statLogger");
    Logger elog = LoggerFactory.getLogger("errorLogger");
}

Тест печати журнала с использованием LogApi

@RestController
@RequestMapping("/test")
public class LogController  {
    @GetMapping
    public void log() {

        blog.trace("测试业务日志 trace");
        blog.debug("测试业务日志 debug");
        blog.info("测试业务日志 info");
        blog.warn("测试业务日志 warn");
        blog.error("测试业务日志 error");

        elog.trace("测试异常日志 trace");
        elog.debug("测试异常日志 debug");
        elog.info("测试异常日志 info");
        elog.warn("测试异常日志 warn");
        elog.error("测试异常日志 error");

        slog.trace("测试统计日志 trace");
        slog.debug("测试统计日志 debug");
        slog.info("测试统计日志 info");
        slog.warn("测试统计日志 warn");
        slog.error("测试统计日志 error");

        dlog.trace("测试摘要日志 trace");
        dlog.debug("测试摘要日志 debug");
        dlog.info("测试摘要日志 info");
        dlog.warn("测试摘要日志 warn");
        dlog.error("测试摘要日志 error");

    }
}

控制台输出效果 生成的目录结构 bizПод содержанием
Для тестирования определено разделение по 2 КБ, поэтому, когда файл больше 2 КБ, он будет помещен в настроенный каталог для создания нового файла.
logTest-biz.log logTest-error.log

Этот пример кода был загруженGitHub.com/Chen Xuan код…