Log4net输出到我的文档

jqn*_*qno 9 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>
Run Code Online (Sandbox Code Playgroud)

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

我想将我的日志写入"真正的"我的文档文件夹.我该怎么做呢?

  • 我试图找到一个类似的环境变量%USERPROFILE%,但似乎没有My Documents的存在.
  • 有一个注册表项,用于定义"我的文档"的真实位置,但无法访问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;
            }
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    这也不起作用:当我检查记录器的内部时,该File属性很高兴地报告Mijn Documenten,但同时日志仍然存在My Documents.

我的想法已经用完了!

sgm*_*ore 10

改变线

<file value="%USERPROFILE%\My Documents\MyApp\log.txt"/>
Run Code Online (Sandbox Code Playgroud)

<file type="log4net.Util.PatternString" value="%envFolderPath{MyDocuments}\MyApp\log.txt" />
Run Code Online (Sandbox Code Playgroud)