Руководство по прокрутке файловых приложений

Руководство по переходу файловых приложений

1. обзор

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

Библиотеки журналирования решают эту проблему с помощьюrolling file appenders, which automatically “roll” or archive the current log file and resume logging in a new file при возникновении определенных предопределенных условий, тем самым предотвращая нежелательные простои.

В этой статье мы рассмотрим, как настроить добавление файлов в некоторых наиболее широко используемых библиотеках журналирования - Log4j, Log4j2 и Slf4j.

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

2. Наш образец приложения

Начнем с примера приложения, которое регистрирует некоторые сообщения. Этот код основан на Log4j, но его можно легко изменить для работы с Log4j2 или Slf4j:

import org.apache.log4j.Logger;

public class Log4jRollingExample {

    private static Logger logger = Logger.getLogger(Log4jRollingExample.class);

    public static void main(String[] args) throws InterruptedException {
        for(int i = 0; i < 2000; i++) {
            logger.info("This is the " + i + " time I say 'Hello World'.");
            Thread.sleep(100);
        }
    }
}

Приложение довольно наивно - оно записывает некоторые сообщения в цикле с небольшой задержкой между итерациями. При запуске 2000 циклов и паузе в 100 мс в каждом цикле приложение должно занять чуть более трех минут.

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

3. Прокрутка файловых приложений в Log4j

3.1. Maven Зависимости

Прежде всего, чтобы использовать Log4j в вашем приложении, добавьте эту зависимость в файлpom.xml вашего проекта:


    log4j
    log4j
    1.2.17

Чтобы использовать дополнительные приложения, предоставляемыеapache-log-extras, которые мы будем использовать в следующих примерах, добавьте следующую зависимость, обязательно используя ту же версию, которую мы объявили для Log4j, чтобы обеспечить полную совместимость:


    log4j
    apache-log4j-extras
    1.2.17

Вы можете найти последний выпускLog4j иApache Log4j Extras на Maven Central.

3.2. Прокрутка в зависимости от размера файла

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


    
    
    
        
            
        

Здесь мы настроили Log4j для прокрутки файла журнала, когда его размер достигнет 5 КБ, используя параметрMaxFileSize. Мы также проинструктировали Log4j хранить максимум два свернутых файла журнала, используя параметрMaxBackupIndex.

Когда мы запустили наш пример приложения, мы получили следующие файлы:

27/11/2016  10:28    138 app.log
27/11/2016  10:28  5.281 app.log.1
27/11/2016  10:28  5.281 app.log.2

Что случилось? Log4j начал писать в файлapp.log. Когда размер файла превысил ограничение в 5 КБ, Log4j переместилapp.log вapp.log.1, создал новый, пустойapp.log и продолжил запись новых сообщений журнала вapp.log.

Затем, когда новыйapp.log превысил ограничение в 5 КБ, этот процесс прокатки был повторен. На этот разapp.log.1 был перемещен вapp.log.2,, освобождая место для другого нового, пустогоapp.log.

Процесс прокатки повторялся несколько раз во время выполнения, но, поскольку мы настроили наш аппендер на хранение не более двух свернутых файлов, нет ни одного файла с именемapp.log.3.

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

С другой стороны, когда мы проверили первую строкуapp.log.2, она содержала сообщение, относящееся к 700-й итерации, то есть все предыдущие сообщения журнала были потеряны:

2016-11-27 10:28:34 INFO  This is the 700 time I say 'Hello World'.

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

Для этого мы собираемся использовать другие более мощные, гибкие и настраиваемые приложения Log4j, которые поставляются в специальном пакете под названиемapache-log4j-extras.

Добавления, содержащиеся в этом артефакте, предлагают множество опций для точной настройки прокрутки журнала, и они вводят различные концепцииtriggering policy иrolling policy. triggering policy описывает, когда должна произойти прокатка, аrolling policy описывает, как должна выполняться прокатка. Эти две концепции являются ключевыми для смены файлов журналов и более или менее явно используются и другими библиотеками, как мы скоро увидим.

3.3. Прокатка с автоматическим сжатием

Вернемся к примеру Log4j и улучшим нашу настройку, добавив автоматическое сжатие свернутых файлов для экономии места:


    
        
        
    
    
    
    
        
    
    
        
    

С элементомtriggering policy мы заявили, что откат должен происходить, когда размер журнала превышает 5120 байт.

В тегеrolling policy, параметрActiveFileName указывает путь к основным файлам журнала, содержащим последние сообщения, а параметрFileNamePattern указывает шаблон, описывающий, какой должен быть путь к накатанные файлы. Отметим, что это действительно шаблон, потому что специальный заполнитель%i будет заменен индексом свернутого файла.

Также отметим, чтоFileNamePattern заканчивается расширением «.gz”. Всякий раз, когда мы используем расширение, связанное с поддерживаемым сжатым форматом, старые сжатые файлы будут сжаты без каких-либо дополнительных усилий с нашей стороны.

Теперь, когда мы запускаем приложение, мы получаем другой набор файлов журнала:

03/12/2016 19:24 88 app.1.log.gz
...
03/12/2016 19:26 88 app.2.log.gz
03/12/2016 19:26 88 app.3.log.gz
03/12/2016 19:27 70 app.current.log

Файлapp.current.log - это место, где произошли последние журналы. Предыдущие журналы были свернуты и сжаты, когда их размер достиг установленного предела.

3.4. Прокрутка по дате и времени

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

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


    
        
    
    
        
    

3.5. Прокатка в зависимости от размера и времени

КомбинируяSizeBasedTriggeringPolicy иTimeBasedRollingPolicy,, вы можете получить аппендер, который вращается в зависимости от даты / времени, и когда размер файла достигает установленного предела, он также вращается в зависимости от размера:


    
        
        
    
    
        
    
    
        
    

Когда мы запустили наше приложение с этой настройкой, мы получили следующие файлы журнала:

03/12/2016 19:25 234 app.19-25.1481393432120.log.gz
03/12/2016 19:25 234 app.19-25.1481393438939.log.gz
03/12/2016 19:26 244 app.19-26.1481393441940.log.gz
03/12/2016 19:26 240 app.19-26.1481393449152.log.gz
03/12/2016 19:26 3.528 app.19-26.1481393470902.log

В файлеapp.19-26.1481393470902.log происходит текущее ведение журнала. Как видите, все журналы в интервале между 19:25 и 19:26 хранятся в нескольких сжатых файлах журналов с именами, начинающимися с «app.19-25″.». Заполнитель“%i” заменяется постоянно увеличивающимся числом. .

4. Прокрутка файловых приложений в Log4j2

4.1. Maven Зависимости

Чтобы использовать Log4j2 в качестве нашей предпочтительной библиотеки журналов, нам нужно обновить POM нашего проекта со следующей зависимостью:


    org.apache.logging.log4j
    log4j-core
    2.7

Как обычно, вы можете найтиlatest version на Maven Central.

4.2. Прокрутка в зависимости от размера файла

Давайте изменим наш пример приложения, чтобы использовать библиотеки журналов Log4j2, и давайте теперь исследуем, как мы можем настроить прокатку файлов в зависимости от размера файла журнала в файле конфигурацииlog4j2.xml:


    
        %d{yyyy-MM-dd HH:mm:ss} %p %m%n
    
    
        
        
    

В тегеPolicies мы указали все политики запуска, которые хотим применить. OnStartupTriggeringPolicy запускает проверку при каждом запуске приложения, что может быть полезно для автономных приложений. Затем мы указалиSizeBasedTriggeringPolicy, в котором говорится, что проверка должна выполняться всякий раз, когда файл журнала достигает 5 КБ.

4.3. Прокрутка по дате и времени

Используя политики, предлагаемые Log4j2, давайте настроим приложение для прокрутки и сжатия файла журнала в зависимости от времени:


    
        %d{yyyy-MM-dd HH:mm:ss} %p %m%n
    
    

Ключевым моментом здесь является использованиеTimeBasedTriggeringPolicy, которое позволяет нам использовать связанные со временем заполнители в шаблоне свернутых имен файлов. Обратите внимание, что, поскольку нам нужна только одна политика запуска, нам не нужно использовать тегPolicies, как мы это делали в предыдущем примере.

4.4. Прокатка в зависимости от размера и времени

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


    
        %d{yyyy-MM-dd HH:mm:ss} %p %m%n
    
    
        
        
        
    
    
        
            
            
        
    

С этой конфигурацией мы заявили, что крен должен происходить в зависимости от времени и размера. Приложение может понять, о каком временном интервале мы говорим, благодаря шаблону, используемому для имени файла, «app.%d{MM-dd-yyyy-HH-mm}.%i.log.gz”, который неявно устанавливает повторение, которое должно происходить каждую минуту, и сжимает свернутый файл.

Мы также добавилиDefaultRolloverStrategy для удаления старых свернутых файлов, соответствующих определенным критериям. Мы настраиваем свои файлы на удаление файлов, которые соответствуют заданному шаблону, если они старше 20 дней.

4.5. Maven Зависимости

Чтобы использовать Log4j2 в качестве нашей предпочтительной библиотеки журналов, нам нужно обновить POM нашего проекта со следующей зависимостью:


    org.apache.logging.log4j
    log4j-core
    2.7

Как обычно, вы можете найтиlatest version на Maven Central.

5. Прокрутка файловых приложений в Slf4j

5.1. Maven Зависимости

Если вы хотите использовать Slf4j2 с бэкэндом Logback в качестве библиотек журналирования, добавьте эту зависимость в свойpom.xml:


    ch.qos.logback
    logback-classic
    1.1.7

Как обычно, вы можете найтиlatest version на Maven Central.

5.2. Прокрутка в зависимости от размера файла

Давайте теперь посмотрим, как использовать вместо этого Slf4j с его внутренним сервером по умолчаниюLogback. Давайте рассмотрим, как мы можем настроить прокатку файлов в файле конфигурацииlogback.xml, который помещается в путь к классам приложения:


    target/slf4j/roll-by-size/app.log
    
        target/slf4j/roll-by-size/app.%i.log.zip
        1
        3
        1MB
    
    
       5KB
    
    
        %-4relative [%thread] %-5level %logger{35} - %msg%n
    

Снова мы сталкиваемся с концепцией скользящей политики. Основной механизм такой же, как и в Log4j и Log4j2. FixedWindowRollingPolicy позволяет нам использовать заполнитель индекса в шаблоне имени свернутого файла.

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

5.3. Прокатка по времени

В Slf4j мы можем свернуть файл журнала в зависимости от времени, используя предоставленныйTimeBasedRollingPolicy. Эта политика позволяет нам указывать имя шаблона скользящего файла, используя заполнители, связанные с датой и временем:


    target/slf4j/roll-by-time/app.log
    
        target/slf4j/roll-by-time/app.%d{yyyy-MM-dd-HH-mm}.log.zip
        
        20
        1MB
    
    
        %d{yyyy-MM-dd HH:mm:ss} %p %m%n
    

5.4. Прокатка в зависимости от размера и времени

Если вам нужно свернуть файл как по времени, так и по размеру, вы можете использовать предоставленныйSizeAndTimeBasedRollingPolicy. При использовании этой политики вы должны указать как местозаполнитель, связанный со временем, так и заполнитель индекса.

Каждый раз, когда размер файла журнала за определенный промежуток времени выходит за пределы установленного ограничения размера, создается другой файл журнала с тем же значением для заполнителя, связанного со временем, но с увеличенным индексом:


    target/slf4j/roll-by-time-and-size/app.log
    
        
            target/slf4j/roll-by-time-and-size/app.%d{yyyy-MM-dd-mm}.%i.log.zip
        
        5KB
        20
        1MB
    
    
        %d{yyyy-MM-dd HH:mm:ss} %p %m%n
    

6. Заключение

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

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

Related