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