Logback: возможно ли объединить TimeBasedRollingPolicy с SizeBasedTriggeringPolicy? - PullRequest
0 голосов
/ 11 сентября 2018

Я использую 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, но он только разбивает свернутые файлы на более мелкие части, но не смотрит на размер исходного файла журнала.

1 Ответ

0 голосов
/ 04 января 2019

Возможно ли объединить 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}.

Приведенный выше аппендер при использовании выдает:

enter image description here

Вы можете видеть, что файлы вращаются с максимальным размером 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>
...