私はlog4j2を使ってログを作成するプロセスが何千もあり、ファイルシステムに負担をかけるため、すべてのロールオーバーですべてのファイルの名前を変更することはできません。名前を変更せずにファイルを制限するために、log4j 2.5 RollingRandomAccessFileAppenderをプログラムで設定するにはどうすればよいですか?
は現在、私はアペンダを作成するために、次のコードがあります。
PathCondition[] pathConditions = new PathCondition[1];
pathConditions[0] = IfAccumulatedFileCount.createFileCountCondition(10);
DeleteAction deleteAction = DeleteAction.createDeleteAction(basePath, true, 1, true, null, pathConditions, null, config);
Action[] actions = new Action[1];
actions[0] = deleteAction;
String filename = "file";
String filePattern = fileName + "_%i.log";
RollingRandomAccessFileAppender appender = RollingRandomAccessFileAppender.createAppender(
fileName,
filePattern,
"false", // append
"RollingRandomAccessFileAppender", // name
"true", // immediateFlush
"8192", // bufferSizeStr
SizeBasedTriggeringPolicy.createPolicy(Long.valueOf(maxFileSizeInMB*1024*1024).toString()),
DefaultRolloverStrategy.createStrategy(Integer.valueOf(Integer.MAX_VALUE).toString(), "1", "max", null, actions, true, config),
getLayout(),
null, // filter
"true", // ignore exceptions (they get logged)
"false", // advertise
"", // advertiseURI
config);
をしかし、私はそれを実行したとき、それは1と整数間のすべてのファイルをstatをしようとしているファイルシステムをスパムているように私のプロセスはOSによって殺害されます。かなりの衝撃として来たMAX_VALUEは、straceのを-fから、(それに続く番号を探すための理由がない1、存在しないファイルを見つけた後、欠陥のように思える):
...
[pid 18155] stat("file_2147412901.log", 0x2b74134f96d0) = -1 ENOENT (No such file or directory)
[pid 18155] stat("file_2147412901.log", 0x2b74134f96d0) = -1 ENOENT (No such file or directory)
[pid 18155] stat("file_2147412900.log", 0x2b74134f96d0) = -1 ENOENT (No such file or directory)
[pid 18155] stat("file_2147412900.log", 0x2b74134f96d0) = -1 ENOENT (No such file or directory)
[pid 18155] stat("file_2147412899.log", 0x2b74134f96d0) = -1 ENOENT (No such file or directory)
[pid 18155] stat("file_2147412899.log", 0x2b74134f96d0) = -1 ENOENT (No such file or directory)
[pid 18155] stat("file_2147412898.log", 0x2b74134f96d0) = -1 ENOENT (No such file or directory)
[pid 18155] stat("file_2147412898.log", 0x2b74134f96d0) = -1 ENOENT (No such file or directory)
[pid 18155] stat("file_2147412897.log", 0x2b74134f96d0) = -1 ENOENT (No such file or directory)
[pid 18155] stat("file_2147412897.log", 0x2b74134f96d0) = -1 ENOENT (No such file or directory)
[pid 18155] stat("file_2147412896.log", 0x2b74134f96d0) = -1 ENOENT (No such file or directory)
[pid 18155] stat("file_2147412896.log", 0x2b74134f96d0) = -1 ENOENT (No such file or directory)
[pid 18155] stat("file_2147412895.log", 0x2b74134f96d0) = -1 ENOENT (No such file or directory)
[pid 18155] stat("file_2147412895.log", 0x2b74134f96d0) = -1 ENOENT (No such file or directory)
[pid 18155] stat("file_2147412894.log", 0x2b74134f96d0) = -1 ENOENT (No such file or directory)
[pid 18155] stat("file_2147412894.log", 0x2b74134f96d0) = -1 ENOENT (No such file or directory)
[pid 18155] stat("file_2147412893.log", 0x2b74134f96d0) = -1 ENOENT (No such file or directory)
[pid 18155] stat("file_2147412893.log", 0x2b74134f96d0) = -1 ENOENT (No such file or directory)
[pid 18155] stat("file_2147412892.log", 0x2b74134f96d0) = -1 ENOENT (No such file or directory)
[pid 18155] stat("file_2147412892.log", 0x2b74134f96d0) = -1 ENOENT (No such file or directory)
[pid 18155] stat("file_2147412891.log", 0x2b74134f96d0) = -1 ENOENT (No such file or directory)
...
スタックトレースJVMで、この一方で現在起こっています:
at java.io.UnixFileSystem.getBooleanAttributes0(Native Method)
at java.io.UnixFileSystem.getBooleanAttributes(UnixFileSystem.java:242)
at java.io.File.exists(File.java:819)
at org.apache.logging.log4j.core.appender.rolling.DefaultRolloverStrategy.purgeAscending(DefaultRolloverStrategy.java:305)
at org.apache.logging.log4j.core.appender.rolling.DefaultRolloverStrategy.purge(DefaultRolloverStrategy.java:279)
at org.apache.logging.log4j.core.appender.rolling.DefaultRolloverStrategy.rollover(DefaultRolloverStrategy.java:506)
at org.apache.logging.log4j.core.appender.rolling.RollingFileManager.rollover(RollingFileManager.java:196)
at org.apache.logging.log4j.core.appender.rolling.RollingFileManager.rollover(RollingFileManager.java:124)
- locked <0x00000005c0196238> (a org.apache.logging.log4j.core.appender.rolling.RollingRandomAccessFileManager)
at org.apache.logging.log4j.core.appender.rolling.RollingFileManager.checkRollover(RollingFileManager.java:119)
- locked <0x00000005c0196238> (a org.apache.logging.log4j.core.appender.rolling.RollingRandomAccessFileManager)
at org.apache.logging.log4j.core.appender.RollingRandomAccessFileAppender.append(RollingRandomAccessFileAppender.java:89)
at org.apache.logging.log4j.core.config.AppenderControl.tryCallAppender(AppenderControl.java:152)
at org.apache.logging.log4j.core.config.AppenderControl.callAppender0(AppenderControl.java:125)
at org.apache.logging.log4j.core.config.AppenderControl.callAppenderPreventRecursion(AppenderControl.java:116)
at org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:84)
at org.apache.logging.log4j.core.config.LoggerConfig.callAppenders(LoggerConfig.java:390)
at org.apache.logging.log4j.core.config.LoggerConfig.processLogEvent(LoggerConfig.java:378)
at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:362)
at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:352)
at org.apache.logging.log4j.core.config.AwaitCompletionReliabilityStrategy.log(AwaitCompletionReliabilityStrategy.java:63)
at org.apache.logging.log4j.core.Logger.logMessage(Logger.java:147)
at org.apache.logging.log4j.spi.AbstractLogger.logMessage(AbstractLogger.java:1011)
at org.apache.logging.log4j.spi.AbstractLogger.logIfEnabled(AbstractLogger.java:988)
at org.apache.logging.log4j.spi.AbstractLogger.log(AbstractLogger.java:866)
ファイルの名前変更を防止するために、私は何とかDeleteActionを使用してファイル数を減らしながら、任意に高い数値にロールバックさせることができるようにしていました。
あなたのユースケースは、よりモジュラーなロールオーバー戦略の必要性を示す良い例です。https://issues.apache.org/jira/browse/LOG4J2-1198 –