10

在我们的 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.
  • 我试图以File编程方式覆盖我的 appender 的参数,如下所示:

    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.

我的想法不多了!

4

3 回答 3

10

换行

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

<file type="log4net.Util.PatternString" value="%envFolderPath{MyDocuments}\MyApp\log.txt" />
于 2013-08-21T18:49:41.583 回答
2

接受的答案已过时。

您现在应该使用:

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

(这甚至应该在 Windows 7 上工作,其中“文档”由别名“我的文档”引用。)

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

于 2018-01-23T00:37:18.810 回答
1

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

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

    <file value="%MYAPP_USER_ROOTFOLDER%\MyApp\log.txt"/>

  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-运行时的日志文件位置/

于 2013-08-21T18:48:03.153 回答