1. Список апендерів

Логер дозволяє зберігати дані одразу в декілька файлів. Такі вихідні потоки даних називаються апендерами (від append). Існує досить багато стандартних апендерів, тому ми розглянемо лише найпопулярніші з них:

Апендери Опис
1 Console Виводить дані в консолі
2 File Виводить дані у файл
3 DailyRollingFile Виводить дані у файл, файл циклічно перезаписується
4 Async Дозволяє писати дані в інший апендер асинхронно
5 Socket Пише дані у певний сокет
6 JDBC Пише повідомлення до бази за протоколом JDBC
7 JPA Пише повідомлення до бази за протоколом JPA
8 HTTP Шле події HTTP-протоколом на віддалений сервер
9 SMTP Складає повідомлення в буфер, а потім надсилає у вигляді email'а

Хороша документація щодо всіх апендерів є на їхньому офіційному сайті.

А тепер ми розглянемо найпопулярніші та найпростіші з них.

2. ConsoleAppender

Найпростіший апендер – це ConsoleAppender. Як ти вже здогадуєшся, він пише свої повідомлення просто в консолі. Він має кілька цікавих нам параметрів:

Атрибути
1 name Ім'я апендера
2 filter Дозволяє відфільтрувати частину повідомлень
3 layout Встановлює форматування повідомлень під час виведення
4 target Вказує, куди пишемо: SYSTEM_OUT або SYSTEM_ERR

Налаштувати його дуже просто:


    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration status="warn" name="MyApp" packages="">
    <Appenders>
        <Console name="STDOUT" target="SYSTEM_OUT">
        <PatternLayout pattern="%m%n"/>
        </Console>
    </Appenders>
      <Loggers>
        <Root level="error">
        <AppenderRef ref="STDOUT"/>
        </Root>
    </Loggers>
    </Configuration>

3. FileAppender

Найкорисніший апендер – це FileAppender. На відміну від ConsoleAppender він пише свої повідомлення у файл. Що дуже корисно, коли твоя програма працює десь на сервері. В нього купа властивостей, оскільки він має вміти писати файли у різних операційних системах.

Але ми розглянемо лише найпопулярніші з них:

1 name Вказує ім'я апендера
2 filter Дозволяє відфільтрувати частину повідомлень
3 layout Встановлює форматування повідомлень під час виведення
4 fileName Вказує ім'я файлу, в який треба писати повідомлення
5 append Якщо true, повідомлення допишуться в старий лог, якщо false – лог-файл буде створюватися наново щоразу під час запуску програми.
6 bufferSize Встановлює розмір буфера в байтах
7 immediateFlush Якщо true, кожне повідомлення одразу пишеться на диск (без буфера). Лог починає працювати повільно, але це рятує від втрати даних під час падіння програми.

Ти вже вмієш добре працювати з файлами, тому в цих налаштуваннях для тебе нема нічого нового. Налаштувати такий логер навіть простіше ніж консольний:


    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration status="warn" name="MyApp" packages="">
    <Appenders>
        <File name="MyFile" fileName="logs/app.log">
        <PatternLayout>
            <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
        </PatternLayout>
        </File>
    </Appenders>
    <Loggers>
        <Root level="error">
        <AppenderRef ref="MyFile"/>
        </Root>
    </Loggers>
    </Configuration>

4. RollingFileAppender

Найпопулярніший апендер – це RollingFileAppender. На відміну від FileAppender він дозволяє розбити лог на багато маленьких файлів. Це супер актуально для великих логів. До того ж, він дозволяє встановити правила: що робити зі старими файлами після того, як почали писатися нові.

У цього апендера майже під сотню різних налаштувань. Докладніше з ними можна ознайомитися за цим посиланням.

Розглянемо найпопулярніші атрибути цього апендера:

Атрибути
1 name Встановлює ім'я апендера
2 filter Дозволяє відфільтрувати частину повідомлень
3 layout Встановлює форматування повідомлень під час виведення
4 fileName Вказує ім'я файлу, в який потрібно писати повідомлення
5 filePattern Встановлює шаблон імен для архівних файлів, які більше не пишуться
6 policy Встановлює умову, коли файл повинен почати перезаписуватися
7 strategy Описує, що робити зі старими файлами: архівувати, за скільки днів історію зберігати тощо.

Ось хороший приклад:


<Configuration status="warn" name="MyApp" packages="">
  <Appenders>
    <RollingFile name="RollingFile" fileName="logs/app.log" filePattern="logs/app-%d{MM-dd-yyyy}-%i.log.gz">
    <PatternLayout>
        <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
    </PatternLayout>
    <Policies>
        <TimeBasedTriggeringPolicy />
        <SizeBasedTriggeringPolicy size="250 MB"/>
    </Policies>
    </RollingFile>
  </Appenders>
  <Loggers>
    <Root level="error">
    <AppenderRef ref="RollingFile"/>
    </Root>
  </Loggers>
</Configuration>

За допомогою параметра filePattern встановлено шаблон для архівів старих логів. Також тут є два параметри, при спрацьовуванні яких писатиметься новий файл:

  • TimeBasedTriggeringPolicy – спрацює, якщо розпочнеться нова доба (поміняється поточна дата)
  • SizeBasedTriggeringPolicy - спрацює, якщо розмір файлу досягне 250Мб