我有一个程序,我试图以编程方式更改滚动文件appender的默认翻转策略,如果我将IfFilName路径条件保留在其中,并且仅使用IfLastModified路径条件,那么一切正常要完美地工作,但是当我添加IfFileName条件时,它会停止删除文件......
所以我创造这种情况的方式有问题。
我的xml文件将此设置为appender -
<RollingFile name="RollingFile" fileName="cc" filePattern="logs/${baseFileName}-%d{yyyy-MM-dd}.log.gz">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%-40t] %-5level %-80.80l - %msg%n"/>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<DefaultRolloverStrategy>
<Delete basePath="logs/">
<IfFileName glob="${baseFileName}-*.log.gz" />
<IfLastModified age="2d" />
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
所以,正如您所看到的,每个日志文件都保存在基本目录的logs文件夹中,该目录以此属性设置在顶部命名 -
<Properties>
<Property name="baseFileName" value="VrsEditor"/>
</Properties>
它的设置是这样的,因为程序的不同服务有不同的名称,所以baseFileName基于哪个配置文件/类正在进行日志记录...
这个配置文件运行良好并完成工作,但是当我应用我的方法更改默认翻转策略时,如果我包含IfFileName条件,它将停止工作
这是我如何设置这个条件 -
IfFileName fileName = IfFileName.createNameCondition("${baseFileName}-*.log.gz", "${baseFileName}-*.log.gz");
createNameCondition方法是这样的 -
createNameCondition( @PluginAttribute(value="glob")
String glob,
@PluginAttribute(value="regex")
String regex)
所以对于这个方法,我需要传入一个String glob值和一个String regex值....正如你在上面看到的那样,我只使用了原始配置文件中完全相同的String,因为我只想要这个要更改的方法是IfLastModified条件,保存文件的天数。
有没有人知道为什么这个IfFileName条件不能正常工作,即使我传入与它工作的原始配置文件完全相同的值?
我在想它唯一可能的是Regex部分,因为String部分应该完全相同没有?
我需要使用什么样的正则表达式转换才能将“$ {baseFileName} - *。log.gz”转换为正则表达式?或者如果还有其他问题,为什么这个IfFileName条件不能以编程方式工作,而是从配置文件本身工作?
答案 0 :(得分:0)
您可以通过在配置文件的顶部设置<Configuration status="trace">
来调试正在发生的事情。这会将内部Log4j2调试语句打印到控制台。 Log4j2中的自定义删除操作具有相当详细的日志记录。
我怀疑发生的事情是你的glob的${baseFileName}
部分按字面解释。您希望这是一个在自定义删除操作触发之前被某个路径替换的变量,但我怀疑该模式未被替换。
调试会告诉你发生了什么。如果我没错,解决方法是使用文字值。 (并且您可以在Log4j2 JIRA问题跟踪器上提出功能请求。)