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

fkaflof6  于 2022-11-06  发布在  其他
关注(0)|答案(3)|浏览(233)

我有问题的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....

它不遵循任何规则写入文件。现在暂时我所做的是增加了备份索引的限制。
任何人都有任何想法如何摆脱这种恼人的日志记录。有很多问题关于如何使多个日志文件,但我没有找到如何避免这种类型的多个写入。
先谢谢你。

biswetbf

biswetbf1#

您有一个RollingFileAppender,而您的配置要求每当日志大小达到~ 30 MB (MaxFileSize=30720KB)时,就拆分日志文件。另一个选项(MaxBackupIndex=10)将最多保留10个文件的历史记录。
此外,记录器示例是异步的,因此打印的日志将不同步。

tjvv9vkg

tjvv9vkg2#

这些设置将执行您指定的操作。
以以下示例设置为例(出于演示目的,将日志文件大小减少到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,以此类推,直到达到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

bfhwhh0e

bfhwhh0e3#

而不是RollingFileAppender使用DailyRollingFileAppenderDailyRollingFileAppender每天只写2个日志文件(上午和下午)。也许这将解决你的问题。如果你想要任何其他细节,让我知道。。将解释

相关问题