繁体   English   中英

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

[英]Avoid writing logs in multiple files at same time - log4j

我在登录 log4j 时遇到问题。 我有一个写入大量日志的应用程序,这就是为什么当它超过文件大小限制时它会生成新文件。 我的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 的限制。

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

提前致谢。

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

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

设置执行您指定的操作。

进行以下示例设置(将用于演示目的的日志文件大小减小到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 

一旦logifle app.log变得更大,然后将MaxFileSize重命名为app.log.1 现有的app.log.1在重命名为app.log.2之前, app.log.2 ,直到达到MaxBackupIndex的最大数量,然后删除最旧的文件。

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

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

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

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

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

使用 DailyRollingFileAppender 代替 RollingFileAppender。 DailyRollingFileAppender 每天只写入 2 个日志文件(上午和下午)。 可能这会解决你的问题。 如果你想要任何其他细节让我知道..会解释

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM