我正在使用log4j2登录我的Java应用程序,该应用程序配置为将日志写入文件。磁盘空间已满时会发生什么? log4j2是否会缓冲日志,直到刷新磁盘为止?如果是,是否会导致OOM错误?
Log4j2被设计为审核日志记录框架。这意味着,如果日志记录对您的应用程序至关重要,那么如果日志记录失败,则应用程序将失败,Log4j2可以完成此任务。
为此,所有内置的附加程序都具有配置属性ignoreExceptions。从手册:
默认值为true,导致在追加事件时遇到的异常会在内部记录,然后被忽略。设置为false时,异常将传播到调用方。
然后考虑编写一个新的Appender,该Appender包装正在访问磁盘的附加程序,并在检测到IOExceptions时尝试执行明智的操作。也许可以将其基本的Appenders写方法包装在try-catch块中,然后向您或系统管理员发送电子邮件。
想法是包含log4j2使用的总可能磁盘空间,就像JVM的最大堆一样。因此,您必须对所有附加程序使用基于大小的策略以及最大翻转。
如果它按预期工作,那么您每个应用程序在任何时候都不应使用超过10GB的空间,因为log4j2还对滚过的文件使用了一些压缩。
例如
<Policies>
<SizeBasedTriggeringPolicy size="1 GB" />
...
<Policies>
...
<DefaultRolloverStrategy max="10"/>
如果您有同时运行多个应用程序的Java应用程序服务器。他们都使用Log4J登录到同一文件系统,仅是出于这个原因而创建的。有时会发生文件系统空间不足而应用程序获取的情况
log4j:ERROR Failed to flush writer,
java.io.IOException
以及是否会收到OOM错误(内存不足)取决于Java堆大小和您期望单笔交易的应用程序的日志量以及应该写入多少数据块。