避免同时在多个文件中写入日志 - log4j

时间:2016-01-26 14:36:01

标签: java logging log4j

我遇到了log4j loggin的问题。我有一个写入大量日志的应用程序,这就是为什么当它超过文件大小的限制时会生成新文件。我的log4j.properties文件如下。 如果我把MaxBackupIndex无限制,那么没有问题。但是,如果我设置限制并且备份索引达到此限制,那么日志系统就会变得疯狂。它开始同时写入不同的日志文件,这使得无法跟踪日志文件。

log4j.rootLogger=ALL,R,C

#Appender R
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=/file_location/app.log
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=[%p]%d{DATE} %l - %m%n
log4j.appender.R.MaxFileSize=30720KB
log4j.appender.R.MaxBackupIndex=10

#Appender C
log4j.appender.C=org.apache.log4j.RollingFileAppender
log4j.appender.C.Threshold=error
log4j.appender.C.layout=org.apache.log4j.PatternLayout
log4j.appender.C.layout.ConversionPattern=[%p]%d{DATE} %l - %m%n
log4j.appender.C.File=/file_location/apps_err.log

例如:

I've app.log, app.log.1, app.log.2 ..... app.log.9. When It reaches the limit than it starts writing something like the following order:
app.log.7
app.log.2
app.log.9
etc etc....

它不遵循任何规则来写入文件。暂时我所做的是增加了BackupIndex的限制。

任何人都知道如何摆脱这种烦人的日志记录。关于如何制作多个日志文件存在很多问题,但我没有找到如何避免这种类型的多重写入。

提前致谢。

2 个答案:

答案 0 :(得分:0)

您有RollingFileAppender并且您的配置表示只要日志大小达到~30MB (MaxFileSize=30720KB),就会拆分日志文件。另一个选项(MaxBackupIndex=10)最多可保留10个文件的历史记录。

此外,记录器实例是异步的,因此打印的日志不会同步。

答案 1 :(得分:0)

设置执行您指定的操作。

采用以下示例设置(将日志文件大小减少到演示目的为1KB

log4j.rootLogger=ALL,R
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=app.log
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=[%p]%d{DATE} %l - %m%n
log4j.appender.R.MaxFileSize=1KB
log4j.appender.R.MaxBackupIndex=10

使用此代码段

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
class LoggerTest {
    static Logger logger = LoggerFactory.getLogger("logger");
    public static void main(String[] args) {
        int length = 129;
        StringBuilder sb = new StringBuilder(length);
        for(int i = 0; i < length; i++) {
            sb.append('x');
        }
        for(int i = 0; i < 61; i++) {
            logger.info(sb.toString());
        }
    }
}

将生成以下文件

app.log    
app.log.1  
app.log.2  
app.log.3  
app.log.4  
app.log.5  
app.log.6  
app.log.7  
app.log.8  
app.log.9  
app.log.10 

只要记录app.log越大,MaxFileSize就会重命名为app.log.1。现有app.log.1之前已重命名为app.log.2,依此类推,直至达到MaxBackupIndex的最大数量,然后删除olderst文件。

如果您的目标是只有一个日志文件app.log,其最大大小为MaxFileSize,则可以将MaxBackupIndex设置为零。但他有一个副作用。如果app.log到达MaxFileSize,则会将其删除,并且以下日志记录语句将进入新的文件。

将上述属性修改为log4j.appender.R.MaxBackupIndex=0 app.log的大小

0
200
400
600
800
1000
0
200
400
600
800
1000
...

没有内置的解决方案来保留单个日志文件,而不会超过MaxFileSize。因为这意味着一旦达到MaxFileSize,您需要从文件开头删除最早的日志记录条目。

一种可能的解决方案可能是将MaxBackupIndex设置为1。因此,您最终只会使用app.logapp.log.1