L'API a changé (par exemple setMaxFileSize n'existe plus) et beaucoup de choses ci-dessus ne semblent fonctionner, mais j'ai quelque chose qui fonctionne pour moi contre le logback 1.1.8 (le dernier en ce moment).
Je voulais lancer au démarrage et rouler sur la taille, mais pas le temps. Il le fait:
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);
}
}
Avec cela, vous avez également besoin d'une politique de roulement. FixedWindowRollingPolicy ferait probablement, mais je ne l'aime pas parce que je veux garder un grand nombre de fichiers et c'est très inefficace pour ça. Quelque chose qui incrémente les nombres (au lieu de glisser comme FixedWindow) fonctionnerait, mais cela n'existe pas. Tant que j'écris le mien, j'ai décidé d'utiliser le temps au lieu de compter. Je voulais étendre le code de logback actuel, mais pour les choses basées sur le temps, les politiques de roulement et de déclenchement sont souvent combinées en une seule classe, et il y a des logs et des champs sans getters, donc j'ai trouvé cela plutôt impossible. Donc j'ai dû faire beaucoup de rien. Je reste simple et n'ai pas implémenté des fonctionnalités comme la compression - j'adorerais les avoir, mais j'essaie simplement de garder les choses simples.
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;
}
}
Et puis config ressemble
<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>
si vous êtes frustré ce n'est pas résolu en mode natif, votez pour elle à
http://jira.qos.ch/browse/LOGBACK-204
http://jira.qos.ch/browse/LOGBACK-215
(il est été des années, et pour moi, c'est un plaisir absolument critique ctionality, bien que je sache que beaucoup d'autres frameworks échouent aussi)
Malheureusement cela ne fonctionne pas parce que la politique de déclenchement retourne null de getElapsedPeriodsFileName() qui explose alors le rollover(). –