2016-05-25 3 views
0

私は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を使用してファイル数を減らしながら、任意に高い数値にロールバックさせることができるようにしていました。

+0

あなたのユースケースは、よりモジュラーなロールオーバー戦略の必要性を示す良い例です。https://issues.apache.org/jira/browse/LOG4J2-1198 –

答えて

1

DefaultRolloStrategyのドキュメントを読むと、この動作が説明されています。これは実際には、任意の数ではなく、かなり小さく、固定数のファイルを保持するように設計されています。

あなたは何をしようとしているのですか?「無制限」のようなファイルの値を追加するか、まったくファイルをパージしようとせず、代わりにDeleteAction設定に頼っていると思います。私はあなたのためにジラの問題を作成することをお勧めします。あなたがより良いパッチを提供できるかどうか。

アップデート:バージョン2.8以降Log4jは、minとmaxの間のすべてのファイルを検索しようとせず、実際にディスク上にあるファイルのみを調べます。これにより、問題が解消されます。また、同じリリースでは、ロールオーバーされたファイルに直接書き込むことができるように新しい機能が追加されたので、名前の変更はまったく必要ありません。

関連する問題