Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 避免同时在多个文件中写入日志-log4j_Java_Logging_Log4j - Fatal编程技术网

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

Java 避免同时在多个文件中写入日志-log4j,java,logging,log4j,Java,Logging,Log4j,我对log4j loggin有问题。我有一个应用程序可以写很多日志,这就是为什么当它超过文件大小的限制时会生成新文件。下面给出了我的log4j.properties文件。 如果我把MaxBackupIndex设置为无限,那么就没有问题了。但是如果我设置了一个限制,备份索引达到这个限制,那么日志记录系统就会变得疯狂。它同时开始写入不同的日志文件,这使得无法跟踪日志文件 log4j.rootLogger=ALL,R,C #Appender R log4j.appender.R=org.apache

我对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....
它不遵循任何规则写入文件。现在,我暂时增加了备份索引的限制

任何人都知道如何摆脱这种烦人的日志记录。关于如何创建多个日志文件有很多问题,但我没有发现如何避免这种类型的多次写入


提前感谢。

您有一个
RollingFileAppender
,您的配置说明,每当日志大小达到~30MB
(MaxFileSize=30720KB)
时,就拆分日志文件。另一个选项
(MaxBackupIndex=10)
将保留最多10个文件的历史记录


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

设置执行您指定的操作

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

使用此代码段

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());
        }
    }
}
一旦logifle
app.log
MaxFileSize
更大,它就会被重命名为
app.log.1
。现有的
app.log.1
在此之前重命名为
app.log.2
,依此类推,直到达到
MaxBackupIndex
的最大数量,然后删除旧的ERST文件

如果您的目标是只有一个日志文件
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.log
app.log.1

您的配置说明:当日志文件
app.log
达到
MaxFileSize=30720KB
的大小时,拆分日志文件并保留十个文件的历史记录
MaxBackupIndex=10
。或者我误解了你的问题,你是对的。所有日志文件在达到30mb时被拆分,并保留10个文件。但问题是当所有10个文件都已满,需要写入更多日志时。我宁愿删除旧的,然后重新开始写作。谢谢你的回答。你能告诉我在RollingFileAppender这个地方我能用什么吗?我想要的是删除最旧的文件,并继续将日志写入我可以控制的文件中。您可以使用FileAppender。它将只写入一个文件。谢谢。。。我试试。谢谢你的帮助。但是FileAppender没有做我想做的事情。FileAppender将所有内容写入一个文件中。我不能对滚动文件设置大小限制或文件限制。你到底想做什么?谢谢你的解释。。。我的目标是拥有(例如)10个备份文件,如您提到的app.log、app.log.1、app.log.2。。。。。app.log.10,当创建了10个最大文件大小的备份文件时,删除最旧的文件并继续写入app.log文件。没有问题,当它达到极限时,它会开始在不同的文件中随机写入。我不想要一个大文件,因为在任何文本编辑器中读取或打开该文件都会变得困难。@Nadimasekarman
MaxFileSize
是主日志文件(在本例中为
app.log
)不适用于所有日志文件的总大小
app.log+app.log.1+…
。您的意思是,如果创建新文件
app.log
是因为它已达到
MaxFileSize
的限制,那么您仍然会在其中一个备份中获得条目,例如
app.log.1
?然后,您应该给出一个示例来演示它的外观。如何在代码中访问记录器?不!我明白。当app.log达到maxsize时,它会重命名文件app.log.1并再次启动app.log。此带扣持续到MaxBackupIndex。到现在为止,我没有问题。但是,当创建的所有备份索引和当前app.log达到其大小限制时,我想删除最旧的文件并继续写入app.log。我面临的问题是,它开始随机写入多个文件。技术上的解决方案是,MaxBackupIndex unlimited或更高的数字可以避免这种随机写入。@NadimAseqAArman如果在本例中将值更改为
MaxBackupIndex=5
,则只有在
app.log.5
之前才有备份(而不是在
app.log.10
之前才有备份)。每次
app.log
将重命名为
app.log.1
时,将删除
app.log.5
,并将
app.log.4
重命名为
app.log.5
(如
MaxBackupIndex
中所述)。如前所述:请添加一个示例。你的问题真的不清楚。
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 
0
200
400
600
800
1000
0
200
400
600
800
1000
...