Как накатить файл журнала при запуске в logback - PullRequest
43 голосов
/ 22 марта 2010

Я бы хотел настроить logback для выполнения следующих действий.

  • Вход в файл
  • Сверните файл, когда он достигнет 50 МБ
  • Храните журналы только за 7 дней
  • При запуске всегда генерировать новый файл (делать бросок)

У меня все работает, за исключением последнего пункта, стартового броска. Кто-нибудь знает, как этого добиться? Вот конфиг ...

  <appender name="File" class="ch.qos.logback.core.rolling.RollingFileAppender">

    <layout class="ch.qos.logback.classic.PatternLayout">
      <Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg \(%file:%line\)%n</Pattern>
    </layout>

    <File>server.log</File>

    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <FileNamePattern>server.%d{yyyy-MM-dd}.log</FileNamePattern>
      <!-- keep 7 days' worth of history -->
      <MaxHistory>7</MaxHistory>

      <TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
        <MaxFileSize>50MB</MaxFileSize>
      </TimeBasedFileNamingAndTriggeringPolicy>

    </rollingPolicy>
  </appender>

Ответы [ 11 ]

0 голосов
/ 13 января 2017

API изменился (например, setMaxFileSize больше не существует), и многие из вышеперечисленных вещей, похоже, не работают, но у меня есть кое-что, что работает для меня против logback 1.1.8 (последний на данный момент) .

Я хотел катиться при запуске и катиться по размеру, но не по времени. Это делает это:

public class RollOnStartupAndSizeTriggeringPolicy<E> extends SizeBasedTriggeringPolicy<E> {
    private final AtomicBoolean firstTime = new AtomicBoolean();

    public boolean isTriggeringEvent(final File activeFile, final E event) {
        if (firstTime.compareAndSet(false, true) && activeFile != null && activeFile.length() > 0) {
            return true;
        }
        return super.isTriggeringEvent(activeFile, event);
    }
}

При этом вам также нужна скользящая политика. FixedWindowRollingPolicy, вероятно, подойдет, но мне это не нравится, потому что я хочу хранить большое количество файлов, и это очень неэффективно для этого. То, что нумерация увеличивается (вместо скольжения, как FixedWindow), будет работать, но этого не существует. Пока я пишу свои собственные, я решил использовать время вместо счета. Я хотел расширить текущий код обратного входа, но в зависимости от времени, скользящая и триггерная политики часто объединяются в один класс, и есть журналы вложенности, циклические вещи и поля без геттеров, поэтому я обнаружил, что это довольно невозможно. Поэтому мне пришлось многое сделать с нуля. Я держу это простым и не реализовал функции как сжатие - я хотел бы иметь их, но я просто пытаюсь сделать это простым.

public class TimestampRollingPolicy<E> extends RollingPolicyBase {
    private final RenameUtil renameUtil = new RenameUtil();
    private String activeFileName;
    private String fileNamePatternStr;
    private FileNamePattern fileNamePattern;

    @Override
    public void start() {
        super.start();
        renameUtil.setContext(this.context);
        activeFileName = getParentsRawFileProperty();
        if (activeFileName == null || activeFileName.isEmpty()) {
            addError("No file set on appender");
        }
        if (fileNamePatternStr == null || fileNamePatternStr.isEmpty()) {
            addError("fileNamePattern not set");
            fileNamePattern = null;
        } else {
            fileNamePattern = new FileNamePattern(fileNamePatternStr, this.context);
        }
        addInfo("Will use the pattern " + fileNamePattern + " to archive files");
    }

    @Override
    public void rollover() throws RolloverFailure {
        File f = new File(activeFileName);
        if (!f.exists()) {
            return;
        }
        if (f.length() <= 0) {
            return;
        }
        try {
            String archiveFileName = fileNamePattern.convert(new Date(f.lastModified()));
            renameUtil.rename(activeFileName, archiveFileName);
        } catch (RolloverFailure e) {
            throw e;
        } catch (Exception e) {
            throw new RolloverFailure(e.toString(), e);
        }
    }

    @Override
    public String getActiveFileName() {
        return activeFileName;
    }

    public void setFileNamePattern(String fnp) {
        fileNamePatternStr = fnp;
    }
}

И тогда конфиг выглядит как

<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
  <encoder>
    <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
  </encoder>
  <file>/tmp/monitor.log</file>
  <rollingPolicy class="my.log.TimestampRollingPolicy">
    <fileNamePattern>/tmp/monitor.%d{yyyyMMdd-HHmmss}.log</fileNamePattern>
  </rollingPolicy>
  <triggeringPolicy class="my.log.RollOnStartupAndSizeTriggeringPolicy">
    <maxFileSize>1gb</maxFileSize>
  </triggeringPolicy>
</appender>

если вы разочарованы, это не решается изначально, проголосуйте за него по

http://jira.qos.ch/browse/LOGBACK-204

http://jira.qos.ch/browse/LOGBACK-215

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

...