强制Log4J每天创建一个新文件(可能为空)

时间:2015-01-22 09:12:29

标签: java log4j rollingfileappender

我配置了log4j来编写使用DailyRollingFileAppenders将日志条目写入一些不同的文件。 其中一个日志在这种情况下是特殊的,它是所有其他日志的摘要,它的阈值是警告(不像其他日志那样)。

这背后的想法很简单:如果一天没有条目,一切都很好,没有必要查看详细日志。

当写入当天的第一个条目时,Log4J会滚动该文件 - 因此,如果有人打开该日志并且当天没有写入条目,则日志将显示数天的条目。

有没有办法强制log4j每天滚动文件而不需要日志条目?或者在启动时滚动?

编辑:以下是属性:

**snipped**
log4j.appender.empty=org.apache.log4j.DailyRollingFileAppender
log4j.appender.empty.MaxBackups=30
log4j.appender.empty.Append=true
log4j.appender.empty.File=/some/dir/shouldBeEmpty.txt
log4j.appender.empty.layout=org.apache.log4j.PatternLayout
log4j.appender.empty.layout.ConversionPattern=%d [%-15.15t] %-5p %-30.30c{1} - %m%n
**snipped**

只是为了确定:我知道,我可以在夜间启动时调用默认警告,这将滚动该文件。但问题是,如果可以在没有记录的情况下滚动。

2 个答案:

答案 0 :(得分:0)

您可以使用两个简单的类java.util.Propertiesorg.apache.log4j.PropertyConfigurator从代码设置log4j配置。因此,首先在java.util.Properties中加载整个log4j数据(您在问题中提供的内容),然后在org.apache.log4j.PropertyConfigurator中设置它。那么你可以做什么,你可以从你自己的log4j.appender.file.File中获取价值。

示例:

String fileName = "//some//dir//" + {DD_MM_YY} + ".txt";`
log4jData += "log4j.appender.empty.File=" + fileName;`

现在,如果您可以通过代码设置一次,则可以根据需要多次设置。创建一个工作人员,负责两件事:

  1. 如果应用程序启动/重新启动,则设置所需的log4j属性和
  2. 在一段时间(如24小时)后配置新的log4j属性(基于您的数据)。
  3. 希望它能奏效。抱歉我的英语不好。

答案 1 :(得分:0)

您要搜索的是CustodianDailyRollingFileAppender。 可以找到here

以下是xml属性文件中的用法示例:

<appender name="CDRFA" class="de.pickert.utils.logger.CustodianDailyRollingFileAppender">
    <param name="File" value="log/filename.log" />
    <param name="Append" value="true" />
    <param name="DatePattern" value ="yyyy-MM-dd"/>
    <param name="CompressBackups" value ="true"/>
    <!-- param name="MaxFileSize" value ="100mb"/>
    <param name="MaxNumbersOfDays" value ="14"/>
    <param name="DeleteFile" value ="false"/-->
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%p %C %d{yyyy-MM-dd HH\:mm\:ss.SSS} %m \n" />
    </layout>
</appender>

修改 还没有看到你想要创建一个空文件。 也许这会有所帮助:

TimeBasedRollingPolicy

指定使用包含当前日期的日志文件名。使用此策略时,无需为triggeringPolicy指定值。要指定何时创建新日志文件,您可以指定以下任一选项:

  • 每当生成的文件名与当前文件名不同时,创建(翻转到)新日志文件。这是默认行为。 例如,如果文件名包含当前年,月和日,则在系统日期更改为新的一天时会创建新文件。
  • 仅在新会话开始时创建新日志文件。 发生翻转时,路径和文件名中的消息日志继续写入当前文件的末尾。从path-and-filename继续的消息Log将写入新创建的文件的开头。

使用以下语法指定TimeBasedRollingPolicy:

<rollingPolicy class="TimeBasedRollingPolicy">
    <param name="fileNamePattern" value="filename-pattern"/>
    <param name="rollOver" value="TRUE | FALSE"/>
</rollingPolicy>

name =“fileNamePattern”value =“ path-and-filename-pattern
指定日志文件的写入路径以及用于创建日志文件名的转换模式。转换模式可包括以下字符:

<强>%d 表示当前日期的显示位置。如果希望日期以yyyymmdd以外的格式显示,或者如果要包含其他信息(如小时),则可以在%d之后的大括号中指定日期格式或日期和时间模式。

<强>%S {键} 表示系统信息(例如主机名,操作系统或系统描述)的显示位置。您必须指定一个键以指示出现的系统信息的类型。

例如,如果要将日志文件写入路径c:\ logs \,并指定包含当前日期和名称的文件名,请指定c:\ logs \ MetadataServer_%d_%S {host_name} .log元数据服务器主机。

默认:必填:
交互:路径和文件名被您为path-and-filename指定的任何值覆盖。

name =“rollOver”value =“TRUE | FALSE”
指示每当生成的文件名与当前文件名不同时是否创建新的日志文件。指定以下值之一:

<强> TRUE
只要生成的文件名与当前文件名不同,就会创建(翻转到)新文件。

Quit not sure if this fits your needs

<强> FALSE
仅在新会话开始时创建新的日志文件。

默认值: TRUE
必填:

source