Log4net输出到我的文档

时间:2013-08-21 18:07:26

标签: c# log4net

在我们的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

我的想法已经用完了!

3 个答案:

答案 0 :(得分:10)

更改行

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

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

答案 1 :(得分:1)

似乎至少有两种方法。最简单的是一种黑客攻击:

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

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

  2. 在启动时,在初始化日志记录之前,请设置此环境变量值:

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

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

答案 2 :(得分:1)

接受的答案已过时。

您现在应该使用:

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

(这应该适用于Windows 7,其中&#34;文档&#34;由别名引用&#34;我的文档&#34;。)

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