11

我有一个使用 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>
4

3 回答 3

17

在这里聚会很晚,但我刚刚遇到了这个并找到了答案。

似乎您可以使用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模式说明符,后跟大括号中的环境变量名称。

于 2019-04-05T16:30:43.693 回答
10

如果这不起作用,则表明您的环境变量错误。

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

于 2013-02-27T13:25:13.743 回答
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;
}
于 2020-01-12T14:50:14.907 回答