log4j2
を使用して日依存のログファイルを作成したい:
<RollingFile name="APP" fileName="application-%d{yyyy-MM-dd}.log" />
結果のログファイル名:application-%d{yyyy-MM-dd}.log
、タイムスタンプは置き換えられません。どうして?
パターンは属性「fileName」で指定するべきではなく、以下のように属性「filePattern」でパターンを指定する必要があります。
<RollingFile name="RollingFile" fileName="${log-path}/filename.log"
filePattern="${log-path}/filename-%d{yyyy-MM-dd}-%i.log" >
...
...
</RollingFile>
「%i」は、ロールオーバー時に自動的にインクリメントされるカウンターです。
これがお役に立てば幸いです。
ファイル名に日付を追加するには、%dを以下の形式に置き換えます。同じ問題が発生していましたが、そうすることで解決しました。
<RollingFile name="APP" fileName="application-${date:yyyy-MM-dd}.log" />
これを試して:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp" packages="">
<Properties>
<Property name="log-path">D:/logs/</Property>
</Properties>
<Appenders>
<RollingFile name="DebuggerLogger" fileName="${log-path}CMSAutomation.${date:yyyy-MM-dd_hh-mm-ss}.log" filePattern="${log-path}/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
<PatternLayout>
<Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="10 MB" />
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<Root level="ALL">
<AppenderRef ref="DebuggerLogger"/>
</Root>
</Loggers>
</Configuration>
アペンダーでASizeBasedTriggeringPolicy
クラスを使用します。現在の秒をログファイル名に追加することもできます。 %d{yyyy_MM_dd HH.mm.ss}
import org.Apache.logging.log4j.core.LogEvent;
import org.Apache.logging.log4j.core.appender.rolling.*;
import org.Apache.logging.log4j.core.config.plugins.Plugin;
import org.Apache.logging.log4j.core.config.plugins.PluginAttribute;
import org.Apache.logging.log4j.core.config.plugins.PluginFactory;
@Plugin(name = "ASizeBasedTriggeringPolicy",
category = "Core",
printObject = true
)
public class ASizeBasedTriggeringPolicy extends AbstractTriggeringPolicy {
private SizeBasedTriggeringPolicy sizeBasedTriggeringPolicy;
private RollingFileManager aManager;
protected ASizeBasedTriggeringPolicy(String maxFileSize) {
sizeBasedTriggeringPolicy = SizeBasedTriggeringPolicy.createPolicy(maxFileSize);
}
public void initialize(RollingFileManager aManager) {
sizeBasedTriggeringPolicy.initialize(aManager);
this.aManager = aManager;
}
public boolean isTriggeringEvent(LogEvent event) {
if (sizeBasedTriggeringPolicy.isTriggeringEvent(event)) {
aManager.getPatternProcessor().setPrevFileTime(System.currentTimeMillis());
return true;
} else {
return false;
}
}
@PluginFactory
public static ASizeBasedTriggeringPolicy createPolicy(@PluginAttribute("size") String size) {
return new ASizeBasedTriggeringPolicy(size);
}
}
次に、ログアペンダーでASizeBasedTriggeringPolicy
を使用します
<RollingFile name="complete-log" fileName="${log-path}/complete-${date:yyyy_MM_dd HH.mm.ss} .log"
filePattern="${log-path}/app-complete-%d{yyyy_MM_dd HH.mm.ss} - %i.log" >
...
...
<Policies>
<ASizeBasedTriggeringPolicy size="200 kB" />
</Policies>
</RollingFile>