[英]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=0
, app.log
的大小为
0
200
400
600
800
1000
0
200
400
600
800
1000
...
没有内置解决方案来保留单个不会扩展到MaxFileSize
日志文件。 因为这意味着一旦达到MaxFileSize
,您就需要从文件的开头删除最早的日志记录条目。
一种可能的解决方案是将MaxBackupIndex
设置为1。 因此,您最终只会得到app.log
和app.log.1
。
使用 DailyRollingFileAppender 代替 RollingFileAppender。 DailyRollingFileAppender 每天只写入 2 个日志文件(上午和下午)。 可能这会解决你的问题。 如果你想要任何其他细节让我知道..会解释
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.