У меня есть тысячи процессов, создающих журналы с использованием log4j2 и переименование всех файлов при каждом опрокидывании, неприемлемо из-за нагрузки, которую он кладет на файловую систему.Как я могу программно настроить log4j 2.5 RollingRandomAccessFileAppender для ограничения файлов без переименования?
В настоящее время у меня есть следующий код, чтобы создать Appender:
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 и Integer. MAX_VALUE вступившая просто шок (кажется дефектом, после того, как найти один несуществующий файл не существует никаких оснований искать последующие номера), из Трассирования -f:
...
[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 –