Logback: возможно ли объединить TimeBasedRollingPolicy с SizeBasedTriggeringPolicy?

Я использую Logback с TimeBasedRollingPolicy, который прокручивает файлы раз в час:

<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    <fileNamePattern>${serverpath}/logs/history-debug/debug.%d{yyyy-MM-dd_HH}.log.zip</fileNamePattern>
    <maxHistory>168</maxHistory> <!--7Days-->
    <totalSizeCap>2GB</totalSizeCap>
</rollingPolicy>

Иногда исходные (еще не свернутые) лог-файлы в моем случае могут вырасти очень большими (несколько ГБ). Теперь я хотел бы добавить SizeBasedTriggeringPolicy в конфигурацию, чтобы дополнительно свернуть файл, когда исходный файл журнала превышает определенный предел (например, 5 ГБ). Таким образом, файлы журналов следует обновлять один раз в час, за исключением случаев, когда файл становится слишком большим, и тогда его следует обновлять раньше.

Я попробовал это:

<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    <fileNamePattern>${serverpath}/logs/history-debug/debug.%d{yyyy-MM-dd_HH}.%i.log.zip</fileNamePattern>
    <maxHistory>168</maxHistory> <!--7Days-->
    <totalSizeCap>2GB</totalSizeCap>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
    <maxFileSize>5GB</maxFileSize>
</triggeringPolicy>

Но затем я получаю сообщение об ошибке, поскольку %i несовместимо с TimeBasedRollingPolicy.

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


person schoenk    schedule 11.09.2018    source источник


Ответы (1)


Можно ли объединить TimeBasedRollingPolicy с SizeBasedTriggeringPolicy?

Да, SizeAndTimeBasedRollingPolicy — это решение для вас.

<appender name="APPLICATION" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>D:/logs/log.txt</file>
    <append>true</append>
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
        <Pattern>%p %d [%t] %L - %m%n</Pattern>
    </encoder>
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
        <!-- rollover daily -->
        <fileNamePattern>D:/logs/log.%d{yyyy-MM-dd HH-mm}.%i.txt</fileNamePattern>
        <maxFileSize>1MB</maxFileSize>
        <!-- keep 30 days' worth of history -->
        <maxHistory>30</maxHistory>
        <totalSizeCap>20GB</totalSizeCap>
    </rollingPolicy>
</appender>

конфигурация для дополнительного свертывания файла, когда исходный файл журнала превышает определенный предел (например, 5 ГБ)

вот ограничение размера для вас: <maxFileSize>1MB</maxFileSize> измените его на 5 ГБ, я тестировал его с 1 МБ, но он будет работать для любого размера

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

Если я вас правильно понял, вы хотите бросить на основе максимального размера или времени, в зависимости от того, что будет достигнуто раньше. Прокатка по времени достигается за счет этого: {yyyy-MM-dd HH-mm}. Это происходит каждую минуту, если вы хотите делать это каждый час, используйте: {yyyy-MM-dd HH}.

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

введите здесь описание изображения

Вы можете видеть, что файлы вращаются с максимальным размером 1 МБ, если этот размер достигает в течение минуты, или если размер не достигает, но время достигает, он все еще катится (это видно в файлах log.2019-01-04 12-23.2.txt и log.2019-01-04 12-24.3.txt)

Logback.xml, который должен работать для вас:

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

<configuration>
    <!-- Send debug messages to System.out -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%p %d [%t] %L - %m%n</pattern>
        </encoder>
    </appender>
    <appender name="APPLICATION" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>D:/logs/log.txt</file>
        <append>true</append>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <Pattern>%p %d [%t] %L - %m%n</Pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- rollover daily -->
            <fileNamePattern>D:/logs/log.%d{yyyy-MM-dd HH}.%i.txt</fileNamePattern>
            <maxFileSize>5GB</maxFileSize>
            <!-- keep 30 days' worth of history -->
<!--            <maxHistory>30</maxHistory>
            <totalSizeCap>20MB</totalSizeCap>-->
        </rollingPolicy>
    </appender>

    <logger name="javaportreader" level="INFO" additivity="false">
        <appender-ref ref="STDOUT" />
    </logger>
    <logger name="application" level="DEBUG" additivity="false">
        <appender-ref ref="APPLICATION"/>
    </logger>

    <!-- By default, the level of the root level is set to DEBUG -->
    <root level="DEBUG">
        <appender-ref ref="STDOUT" />
    </root>
    <root level="INFO">
        <appender-ref ref="APPLICATION"/>
    </root>
</configuration>
person shabby    schedule 04.01.2019