該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那樣滑動)會起作用,但不存在。只要我寫我自己,我決定用時間而不是數。我想擴展當前的logback代碼,但對於基於時間的東西,滾動和觸發策略經常合併到一個類中,並且有嵌套和循環的東西以及沒有getter的字段的日誌,所以我發現這是不可能的。所以我不得不從頭開始做很多事情。我保持簡單,並沒有實現像壓縮這樣的功能 - 我很想擁有它們,但我只是試圖保持簡單。
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
沮喪,這是本身不解決,它投票(這是已經過去了幾年,對我來說這絕對是關鍵的樂趣ctionality,雖然我知道很多其他框架也失敗了)
很遺憾,這不起作用,因爲觸發策略從getElapsedPeriodsFileName()返回null,然後拋出rollover()。 –