【问题标题】:Variable filename in FileAppender and RollingFileAppender in log4netLog4net 中的 FileAppender 和 RollingFileAppender 中的变量文件名
【发布时间】:2019-07-11 11:54:45
【问题描述】:

我正在尝试使用 log4net 使用 log4net.Util.PatternString 登录到具有变量名的文件。 appender 配置如下所示:

<appender name="file2" type="log4net.Appender.FileAppender">
    <file type="log4net.Util.PatternString" value="c:\temp\MyLogFile_PID%processid.log" /> 
    <appendToFile value="true" />       
    <layout type="log4net.Layout.PatternLayout">        
        <conversionPattern value="%date [%thread] %level - %message%newline" />
    </layout>
</appender>

使用此配置,文件已成功创建,其名称如下: MyLogFile_PID12345.log

我已成功使用 %processid、%random{8}、%env{SOME_ENV_VAR}、%property{MYPROPERTY} 和 %appsetting{someKey}。

但我想要的是插入一个日期,无论我尝试什么,似乎我都无法让它理解: %date, %utcdate, %date{DATE}, %utcdate{DATE}, %date{ISO8601}, %date{ABSOLUTE}, %date{{HH:mm:ss} 或基本上任何形式的日期。

例如,哪里出了问题:

<file type="log4net.Util.PatternString" value="c:\temp\MyLogFile_%date{ISO8601}.log" />

我也尝试使用单独的节点进行转换模式配置,但无济于事:

<file type="log4net.Util.PatternString">
    <conversionPattern value="c:\temp\MyLogFile_%date{ISO8601}.log" />
</file>

现在我正在使用自定义属性(使用 %property{MY_CUSTOM_PROPERTY_WITH_THE_NAME_I_WANT})来实现类似的效果,但除了有点矫枉过正之外,我想知道我做错了什么。我在不同的计算机和不同的应用程序中尝试过,但我无法得到我想要的。

顺便说一句,我的真正目的是在 RollingFileAppender 中使用它,但我在这里询问(并尝试)FileAppender 只是为了简单起见。

有什么帮助吗?

【问题讨论】:

    标签: log4net rollingfileappender fileappender


    【解决方案1】:

    我看到您直接使用类型 log4net.Util.PatternString 而不是 appender log4net.Appender.FileAppender,有什么具体原因吗?

    我只是看https://logging.apache.org/log4net/release/config-examples.html的例子

    【讨论】:

    • 我不确定我是否理解你。我正在使用一个 log4net.Appender.FileAppender 我想动态更改其文件值属性。与该页面中的 FileAppender 示例中使用 &lt;file value="${TMP}\log-file.txt" /&gt; 来使用环境变量的方式相同,我想插入一个日期。为此,您必须指定 type="log4net.Util.PatternString" 的文件类型属性。
    • 尝试添加日期格式...我设法使用以下
    • 我的 FileAppender 完整
    【解决方案2】:

    我终于明白了!

    它似乎唯一起作用的方法是指定日期格式字符串,并且其中没有':'

    尽管https://logging.apache.org/log4net/release/sdk/index.html 中的示例使用 %date{HH:mm:ss,fff}, %date{dd MMM yyyy HH:mm:ss,fff}, %date{ISO8601}, %date{绝对}它们似乎都不起作用!

    但是这个(和类似的)终于可以了:

    <file type="log4net.Util.PatternString" value="c:\temp\MyLogFile_%date{yyyy-MM-dd_HH-mm-ss}.log" />
    

    如果我做错了什么或者文档只是令人困惑,我仍然会摸不着头脑。

    我认为这与字符 ':' 在 Linux 文件名中被允许,但在 Windows 上不允许的事实有关(我使用 Windows,作为 90+% 的 log4net 用户,我猜测)。而且 ISO8601 和 ABSOLUTE 也不起作用,可能是因为在这两种情况下 log4net 都将它们转换为带有 ':' 的字符串,但由于相同的原因而失败。

    如果这是真的,作为 .NET 的记录器,这是一个在 Windows 系统中大量使用的框架,我认为这是他们应该考虑的。

    问题已解决(尽管有一些疑问)。

    【讨论】:

      猜你喜欢
      • 2016-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-07
      • 2011-10-17
      • 1970-01-01
      相关资源
      最近更新 更多