我遇到了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的限制。
任何人都知道如何摆脱这种烦人的日志记录。关于如何制作多个日志文件存在很多问题,但我没有找到如何避免这种类型的多重写入。
提前致谢。
答案 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.log
和app.log.1
。