我自己也遇到过这个问题,我花了很长时间才弄清楚。我发现的大多数答案都只是解决方案的一部分,并没有解释它是如何/为什么起作用的……如果你有一个稍微不同的用例,这就很难适应。
示例:
<target name="log"
xsi:type="File"
fileName="${basedir}/logs/log.${longdate:cached=true}.log"
layout="${message}"
archiveFileName="${basedir}/logs/archives/log.${shortdate}.{#}.log"
archiveAboveSize="5242880"
archiveEvery="Day"
archiveNumbering = "Rolling"
maxArchiveFiles="20"
/>
解释
您必须同时使用缓存布局渲染器和 longdate 变量。要了解为什么会这样,您需要了解它们是如何工作的,以及它们是如何交互的。
长日期:
fileName="${basedir}/logs/log.${longdate}.log"
在您的日志名称中使用 longdate 变量几乎可以保证每次执行时都有一个新的日志文件......除了它每毫秒创建一个新的日志文件,即使在单次执行期间也是如此,这可能是不可取的,除非在最罕见的情况下。
缓存布局渲染器:
fileName="${basedir}/logs/log.${shortdate:cached=true}.log"
缓存布局渲染器将在第一次日志调用时缓存变量,然后始终将该值用于后续条目......但缓存仅持续到执行完成。使用 shortdate 或任何其他不能保证在每次执行时更改的变量都行不通。它会找到一个与它想要使用的文件名相同的日志文件,并且它只会追加(或者如果你有那个设置则删除)。这不是我们想要的。
结合:
fileName="${basedir}/logs/log.${longdate:cached=true}.log"
这是有效的,因为它每次执行都会获取第一个日志的毫秒时间戳,然后将其缓存,并始终使用该日志文件,直到执行终止(清除缓存)。下次你运行它时(除非它是相同的毫秒......不太可能!)你会得到一个新的缓存值和一个新的日志文件(但只有一个!)。