如何在Windows XP和7上配置log4net以写入%LOCALAPPDATA%?

时间:2013-02-26 19:28:17

标签: log4net environment-variables

我有一个使用log4net进行日志记录的内部应用程序。我希望在%LOCALAPPDATA%\Vendor\App\application.log生成日志。不幸的是,log4net正在%APPDATA%创建日志文件。这不是一个大问题,因为我们真的不在这里使用漫游配置文件,但我不喜欢在我的代码中留下一些特质,如果我可以避免它。

有关如何将文件写入我指定的位置而不用编程配置log4net并使用pinvoke获取XP路径的任何想法?

如果有任何帮助,这是配置文件的appender部分:

<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
  <file value="${LOCALAPPDATA}\Vendor\App\application.log" />
  <appendToFile value="true" />
  <rollingStyle value="Size" />
  <maxSizeRollBackups value="10" />
  <maximumFileSize value="100KB" />
  <staticLogFileName value="true" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date [%thread] %-5level %logger%newline%message%newline" />
  </layout>
</appender>

3 个答案:

答案 0 :(得分:8)

如果这不起作用,则意味着您的环境变量是错误的。

Log4net没有任何特殊功能来处理appdata或localappdata。它所做的只是调用System.Environment.GetEnvironmentVariables()来返回一个哈希表,并根据返回的值执行替换。

答案 1 :(得分:4)

在这里参加聚会很晚,但是我碰到了这个,找到了答案。

似乎可以使用log4net.Util.PatternString将环境变量插入文件路径。因此,OP的示例变为:

<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
  <file type="log4net.Util.PatternString" value="%env{LOCALAPPDATA}\Vendor\App\application.log" />
  <appendToFile value="true" />
  <rollingStyle value="Size" />
  <maxSizeRollBackups value="10" />
  <maximumFileSize value="100KB" />
  <staticLogFileName value="true" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date [%thread] %-5level %logger%newline%message%newline" />
  </layout>
</appender>

在文件元素中添加 type =“ log4net.Util.PatternString” ,然后指定%env 模式说明符,然后在大括号中指定环境变量名称。< / p>

希望这对某人有帮助!

答案 2 :(得分:0)

对每个人来说,都有和我一样的问题:

  • 即使使用不同的情况,也无法使它正常工作:(例如LocalAppData,LOCALAPPDATA,localappdata)
  • 不能使用“ util.PatternString”,因为配置是通过代码而不是log4net.config文件完成的。

这可以为您提供本地应用程序数据或所需的任何环境变量路径。使用小写字母,例如“ localappdata”!找不到它时返回Empty.string。

private static string GetLocalAppDataPath()
{
    foreach (DictionaryEntry environmentVariable in Environment.GetEnvironmentVariables())
    {
        var environmentVariableString = environmentVariable.Key as string;
        if (environmentVariableString?.ToLower() == "localappdata")
            return (string) environmentVariable.Value;
    }

    return string.Empty;
}