【问题标题】:Log4net output to My DocumentsLog4net 输出到我的文档
【发布时间】:2013-08-21 18:07:26
【问题描述】:

在我们的 C# 应用程序中,我们将文件写入 Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)。我们的 log4net 日志文件也应该去那里,所以我们定义了 application.conf 如下:

<appender name="LogFile" type="log4net.Appender.RollingFileAppender">
  <appendToFile value="true"/>
  <file value="%USERPROFILE%\My Documents\MyApp\log.txt"/>
  ...snip...
</appender>

这有效,直到我们在具有非英语 Windows 的 PC 上运行。因为那时SpecialFolder.MyDocuments 指向文件夹Mijn Documenten,而日志仍然指向My Documents。混乱随之而来,因为现在我们的文件在两个地方。

我想将我的日志写入“真正的”我的文档文件夹。我该怎么做?

  • 我试图找到像 %USERPROFILE% 这样的环境变量,但我的文档似乎没有。
  • 有一个注册表项定义了“我的文档”的真实位置,但无法从 application.conf 访问。
  • 我试图以编程方式覆盖我的 appender 的 File 参数,如下所示:

    public static void ConfigureLogger()
    {
        XmlConfigurator.Configure();
    
        Hierarchy hierarchy = (Hierarchy)log4net.LogManager.GetRepository();
        foreach (var appender in hierarchy.Root.Appenders)
        {
            if (appender is FileAppender)
            {
                var fileAppender = appender as FileAppender;
                var logDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "MyApp");
                var pathElements = fileAppender.File.Split(Path.DirectorySeparatorChar);
                var logFileName = pathElements.Last();
                var fullLogFilePath = Path.Combine(logDirectory, logFileName);
                fileAppender.File = fullLogFilePath;
            }
        }
    }
    

    这也不起作用:当我检查记录器的内部时,File 属性会愉快地报告 Mijn Documenten,但与此同时,日志仍然会转到 My Documents

我的想法快用完了!

【问题讨论】:

    标签: c# log4net


    【解决方案1】:

    换行

    <file value="%USERPROFILE%\My Documents\MyApp\log.txt"/>
    

    <file type="log4net.Util.PatternString" value="%envFolderPath{MyDocuments}\MyApp\log.txt" />
    

    【讨论】:

      【解决方案2】:

      接受的答案已过期。

      你现在应该使用:

      <file value="${UserProfile}\Documents\log-messages.log" />
      

      (即使在 Windows 7 上也可以使用,其中“文档”由别名“我的文档”引用。)

      ${UserProfile} 将映射到 C:\Users[UserName],即使您没有在环境变量列表中看到明确定义的此变量。

      【讨论】:

      • 这还能用吗?在我的情况下,我在 bin 文件夹中创建了 ${UserProfile} 文件夹。
      【解决方案3】:

      似乎至少有两种方法。最简单的是一种 hack:

      1. 在 log4net 配置中指定一个自定义环境变量以指示根路径:

        &lt;file value="%MYAPP_USER_ROOTFOLDER%\MyApp\log.txt"/&gt;

      2. 在启动时,在初始化日志之前,设置这个环境变量值:

        Environment.SetEnvironmentVariable("MYAPP_USER_ROOTFOLDER", Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments));

      这里解释了更复杂但推荐的方法:http://marc.info/?l=log4net-user&m=110142086820117&w=2 和这里http://ziqbalbh.com/articles/log4net-another-way-to-change-log-file-location-on-runtime/

      【讨论】:

        猜你喜欢
        • 2015-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多