анализ журнала - Appender

Spring Apache Log4j

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

Во-первых, давайте представим состав Appender

Диаграмма классов Appender выглядит следующим образом:

image.png

ConsoleAppender

ConsoleAppender для вывода журнала консоли Официальная документация дает пример того, как это написать

<configuration>

  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <!-- encoders are assigned the type
         ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
    <encoder>
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
    </encoder>
  </appender>

  <root level="DEBUG">
    <appender-ref ref="STDOUT" />
  </root>
</configuration>
  • Роль заключается в форматировании журнала, преобразовании его в массив байтов и выводе преобразованного массива байтов в OutputStream. До появления кодировщиков Layout в основном использовался для форматирования журналов.

В настоящее время PatternLayoutEncoder — единственный действительно полезный кодировщик. Он просто охватывает большую часть работы вокруг PatternLayout. Подробнее см. https://logback.qos.ch/manual/encoders.html.

FileAppender

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

<configuration>

  <!-- Insert the current time formatted as "yyyyMMdd'T'HHmmss" under
       the key "bySecond" into the logger context. This value will be
       available to all subsequent configuration elements. -->
  <timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss"/>

  <appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <!-- use the previously created timestamp to create a uniquely
         named log file -->
    <file>log-${bySecond}.txt</file>
    <encoder>
      <pattern>%logger{35} - %msg%n</pattern>
    </encoder>
  </appender>

  <root level="DEBUG">
    <appender-ref ref="FILE" />
  </root>
</configuration>
  • может использовать этот атрибут для записи времени синтаксического анализа этого файла конфигурации (в настоящее время я не могу придумать никакого применения)
  • Адрес и имя файла записи

RollingFileAppender

RollingFileAppender — это расширение FileAppender. По сравнению с его родительским классом, его основная роль заключается в записи скользящих журналов. RollingFileAppender имеет два важных подкомпонента: RollingPolicy и TriggeringPolicy. RollingPolicy определяет метод свертывания журналов, а TriggeringPolicy определяет условия срабатывания для свертывания журналов. (На самом деле, RollingPolicy также может определять условия срабатывания прокрутки.)

Стратегия прокатки RollingPolicy включает в себя следующее:

TimeBasedRollingPolicy

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

<configuration>
  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>logFile.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <!-- daily rollover -->
      <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>

      <!-- keep 30 days' worth of history capped at 3GB total size -->
      <maxHistory>30</maxHistory>
      <totalSizeCap>3GB</totalSizeCap>

    </rollingPolicy>

    <encoder>
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
    </encoder>
  </appender> 

  <root level="DEBUG">
    <appender-ref ref="FILE" />
  </root>
</configuration>
  • Имя прокручиваемого файла также включает выбор времени прокрутки.
  • Количество сохраняемых архивных файлов относительно предыдущего файла fileNamePattern. Предполагая, что определение равно 6, когда fileNamePattern в днях, он сохранит журналы за 6 дней, а если в месяцах, он сохранит журналы за 6 месяцев. Старые журналы удаляются асинхронно.
  • Размер всех заархивированных журналов. При превышении лимита старые журналы архива удаляются.

SizeAndTimeBasedRollingPolicy

SizeAndTimeBasedRollingPolicy — это скользящая политика, основанная на времени и размере файла. Конфигурация примера официальной документации выглядит следующим образом

<configuration>
  <appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>mylog.txt</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
      <!-- rollover daily -->
      <fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>
       <!-- each file should be at most 100MB, keep 60 days worth of history, but at most 20GB -->
       <maxFileSize>100MB</maxFileSize>    
       <maxHistory>60</maxHistory>
       <totalSizeCap>20GB</totalSizeCap>
    </rollingPolicy>
    <encoder>
      <pattern>%msg%n</pattern>
    </encoder>
  </appender>


  <root level="DEBUG">
    <appender-ref ref="ROLLING" />
  </root>

</configuration>

ограничивает все архивные файлы журнала, а ограничивает один файл журнала.

FixedWindowRollingPolicy

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

<configuration>
  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>test.log</file>

    <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
      <fileNamePattern>tests.%i.log.zip</fileNamePattern>
      <minIndex>1</minIndex>
      <maxIndex>3</maxIndex>
    </rollingPolicy>

    <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
      <maxFileSize>5MB</maxFileSize>
    </triggeringPolicy>
    <encoder>
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
    </encoder>
  </appender>
        
  <root level="DEBUG">
    <appender-ref ref="FILE" />
  </root>
</configuration>
  • нижний предел окна. Нижний предел обычно равен 1.
  • верхний предел окна. Как правило, мы можем использовать верхний предел.

SizeBasedTriggeringPolicy

SizeBasedTriggeringPolicy на самом деле является TriggeringPolicy (определяет, когда бросить), и кажется, что на данный момент существует только такая TriggeringPolicy. Основная функция заключается в выполнении прокрутки журнала после того, как архивный файл журнала достигнет определенного размера. Согласно Интернету, TimeBasedRollingPolicy и SizeBasedTriggeringPolicy конфликтуют и не могут использоваться одновременно.

В старой версии logback timeBasedFileNamingAndTriggeringPolicy (класс реализации — SizeAndTimeBasedFNATP) можно настроить в RollingPolicy TimeBasedRollingPolicy для реализации стратегии скользящей настройки времени и размера файла одновременно; в новой версии SizeAndTimeBasedRollingPolicy может удовлетворять обоим требованиям. в то же время.

приложение:

Ниже приведена конфигурация Appender в старой версии:

<!-- 日志文件输出 -->
    <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${log.base}/${log.moduleName}.log</File><!-- 设置日志不超过${log.max.size}时的保存路径,注意如果 是web项目会保存到Tomcat的bin目录 下 -->
        <!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${log.base}/${log.moduleName}_all_%d{yyyy-MM-dd}.%i.log.zip
            </FileNamePattern>
            <!-- 当天的日志大小 超过${log.max.size}时,压缩日志并保存 -->
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>${log.max.size}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <!-- 日志输出的文件的格式  -->
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger{56}.%method:%L -%msg%n</pattern>
        </layout>
    </appender>

Для конфигурации SizeAndTimeBasedRollingPolicy в новой версии официальные примеры следующие:

<configuration>
  <appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>mylog.txt</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
      <!-- rollover daily -->
      <fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>
       <!-- each file should be at most 100MB, keep 60 days worth of history, but at most 20GB -->
       <maxFileSize>100MB</maxFileSize>    
       <maxHistory>60</maxHistory>
       <totalSizeCap>20GB</totalSizeCap>
    </rollingPolicy>
    <encoder>
      <pattern>%msg%n</pattern>
    </encoder>
  </appender>


  <root level="DEBUG">
    <appender-ref ref="ROLLING" />
  </root>

</configuration>