35

我希望 log4net 将日志文件(使用 RollingFileAppender)写入公共应用程序数据文件夹的子文件夹(例如 C:\Documents and Settings\All Users\Application Data\Company\Product\Logs)。
但是,在 Win XP 上,没有指定此文件夹的环境变量。我们有%ALLUSERSPROFILE%,我们有%APPDATA%,但没有什么像%ALLUSERSAPPDATA%
以编程方式,我可以使用Environment.SpecialFolder.CommonApplicationData,但我需要将它放在 log4net 配置中,如下所示:

<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
   <file value="%ALLUSERSAPPDATA%\Company\Product\Logs\error.log" />
</appender>

好的,我们可以在设置中定义它,但也许有人想出了更好的主意?

4

6 回答 6

33

我们只是使用这个:

<param name="File" value="${ALLUSERSPROFILE}/Company/Product/Logs/error.log"/>

它工作得很好。


这一行可以简单地插入到你当前的 appender 配置中:

<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
   <param name="File" value="${ALLUSERSPROFILE}/Company/Product/Logs/error.log"/>
</appender>
于 2009-12-11T17:27:40.697 回答
12

log4net 邮件列表上的这篇文章解释了如何定义自己的路径替换变量。

于 2009-01-22T13:00:59.963 回答
12

这是pilif链接到的 log4net 邮件列表中的完整代码:

基本上,该方法是为 log4net 配置文件实现自定义模式转换器。

首先将此类添加到您的项目中:

public class SpecialFolderPatternConverter : log4net.Util.PatternConverter
{
    override protected void Convert(System.IO.TextWriter writer, object state)
    {
        Environment.SpecialFolder specialFolder = (Environment.SpecialFolder)Enum.Parse(typeof(Environment.SpecialFolder), base.Option, true);
        writer.Write(Environment.GetFolderPath(specialFolder));
    }
}

然后设置 FileAppender 的 File 参数,如下所示:

<file type="log4net.Util.PatternString">
    <converter>
      <name value="folder" />
      <type value="MyAppName.SpecialFolderPatternConverter,MyAppName" />
    </converter>
    <conversionPattern value="%folder{CommonApplicationData}\\SomeOtherFolder\\log.txt" />
</file>

基本上,%folder它告诉它查看调用的转换器,该转换器将folder其指向 SpecialFolderPatternConverter 类。然后它调用Convert该类,传入 CommonApplicationData(或其他)枚举值。

显然,在 log4net (1.2.11) 的下一个版本中,将有一个更简单的方法,如此所述。

于 2010-12-08T16:36:42.677 回答
4

在当前的 log4net 版本(2.0.8.0)中,您可以简单地使用

<file value="${ProgramData}\myFolder\LogFiles\" />为了C:\ProgramData

${LocalAppData}为了C:\Users\user\AppData\Local\

并且${AppData}对于C:\Users\user\AppData\Roaming\

于 2018-09-13T16:46:43.953 回答
3

完整且有效的解决方案 - 我的 Log4net.config 文件的内容。在 Log4Net 的实际版本中,不再需要编写自己的模式转换器

<?xml version="1.0"?>
<log4net>
  <root>
    <level value="INFO" />
    <appender-ref ref="LogFileAppender" />
  </root>
  <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender" >
    <file type="log4net.Util.PatternString" value="%envFolderPath{CommonApplicationData}\\MyProject\\Logs\\log.txt" />
    <rollingStyle value="Size" />
    <maxSizeRollBackups value="10" />
    <maximumFileSize value="100MB" />
    <layout type="log4net.Layout.PatternLayout">
      <ConversionPattern type="log4net.Util.PatternString" value="%%-5p %%d{yyyy-MM-dd HH:mm:ss} - %%m%%n" />
    </layout>
  </appender>
</log4net>
于 2014-06-12T18:09:31.217 回答
1

现在(2018 年 2 月)根据 log4net 版本 2.0.8.0。

您可以不使用任何转换器来获取环境变量,如下所示。

<file type="log4net.Util.PatternString" value="%envFolderPath{CommonApplicationData}\\mylogfile.txt" />

有关详细信息,请参阅:log4net.Util.PatternString类文档。

于 2018-02-19T11:01:30.400 回答