我正在使用log4j2和滚动文件appender来根据大小和时间滚动文件。这是我的配置文件和一个虚拟示例:
log4j2.xml
<RollingFile name="RollingFile" filename="log/${date:dd-MM-yyyy-HH}/currentRoll.log" filePattern="log/%d{dd-MM-yyyy-HH}/Roll-%i.log">
<PatternLayout>
<Pattern>%d{ISO8601}{GMT} %p %c{1.c} [%t] %m%n</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="3KB"/>
</Policies>
</RollingFile>
<Console name="STDOUT" target="SYSTEM_OUT">
<PatternLayout>
<Pattern>%d{ISO8601}{GMT} [%t] %-5p %c{1}: %m%n</Pattern>
</PatternLayout>
</Console>
</Appenders>
<loggers>
<Root level="info">
<AppenderRef ref="Async"/>
</Root>
</loggers>
</Configuration>
和我的虚拟日志记录类:
public class Helloworld extends TimerTask {
private static final Logger logger=LogManager.getLogger("HelloWorld");
@Override
public void run(){
logger.info("fake info message");
logger.info("another fake info message");
}
}
我的问题是我当前的日志(currentRoll.log)文件位于首次创建的文件夹中 该计划开始了。我需要它在最后。例如,如果我在2014年11月25日下午1点和下午3点开始运行该程序,我想查看他们不会在25-11-2014-15文件夹中但在25-11-2014中的当前日志-13文件夹。
我的猜测是${date:dd-MM-yyyy-HH}
未动态解析。我尝试使用监视器间隔轮询自动重新配置:
<Configuration status="info" name="MyApp" packages="" monitorInterval="5">
并使用&#34; $$&#34;如:$${date:dd-MM-yyyy-HH}
但这给了我以下错误:
"2014-11-26 17:22:27,143 ERROR Unable to create file log/${date:dd-MM-yyyy-HH-mm}/currentRoll.log java.io.IOException: The filename, directory name, or volume label syntax is incorrect
我知道log4net有一个datePattern参数可以解决这个问题,但我找不到log4j2的等价物。
关于如何去做的任何建议?
答案 0 :(得分:1)
用于滚动appender的日期在创建滚动日志文件时确定。或者,在log4j术语中,“整个RollingFile元素的分辨率被推迟到匹配发生”。也就是说,{date}属性仅在滚动文件时以指定的分辨率进行插值。
$$工具可用于许多属性,但我不确定{date}是否属于其中之一。我有一种感觉它不是,在这种情况下,所制作的filespec将包含“$ {date ...}”字面意思。这可能是您所看到的错误的根源。
过去,我曾尝试通过“$$ {sys:someProperty}”在appender文件名中使用系统属性(您可以在“属性”部分设置默认值),但是您必须确保您在调用Logger之前设置了有问题的System属性,或者可能以仅使用默认值的滚动文件结束。
请参阅property substitution上的Log4J文档,了解我正在谈论的内容。
在一天结束时,我自己的解决方案可能需要以编程方式实现记录器,以便我可以更改日志文件的根名称,并将最终用户友好属性抽象为简单的属性文件,而不是转储XML文件在他们身上。