2016-05-25 2 views
0

У меня есть тысячи процессов, создающих журналы с использованием 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, чтобы сохранить количество файлов вниз, все еще позволяя им катиться на произвольно большие числа.

+0

Ваш пример использования является хорошей иллюстрацией необходимости более модульной стратегии опрокидывания: https://issues.apache.org/jira/browse/LOG4J2-1198 –

ответ

1

Если вы прочитали документацию по DefaultRolloverStrategy, вы увидите, что она описывает это поведение. Он действительно предназначен для того, чтобы вы сохраняли довольно небольшое фиксированное количество файлов, а не произвольное число.

Для того, что вы пытаетесь сделать, я бы подумал, добавив значение fileIndex что-то вроде «unlimited» или ничего, что бы не пыталось очистить файлы вообще и вместо этого полагаться на вашу конфигурацию DeleteAction было бы разумно. Я бы предложил вам создать для меня проблему с jira. Если вы можете предоставить патч, который будет даже лучше.

Обновление: Начиная с версии 2.8 Log4j больше не пытается искать все файлы между min и max и просматривает только файлы, которые находятся на диске. Это должно помочь устранить проблему, с которой вы столкнулись. Кроме того, в том же выпуске была добавлена ​​новая функция, позволяющая вам напрямую писать в свернутый файл, поэтому переименования не должны происходить вообще.

 Смежные вопросы

  • Нет связанных вопросов^_^