Log4net 附加程序被另一个进程覆盖

Log4net appenders overwritten by another process

我有一个使用 log4net 的应用程序。但是,当我显示 SaveFileDialog 时,appender 会被另一个进程覆盖。查看新的附加程序,我相信这是因为它们来自处理图标覆盖的进程(因为它们使用的日志文件称为 "icon-overlays.log")并且我在我的应用程序中打开了资源管理器。

示例:

Log.Fatal("Before dialog");// logs fine

SaveFileDialog newFileDialog = new Microsoft.Win32.SaveFileDialog();

Log.Fatal("Open dialog");//logs fine

var appenders1 = Log.Logger.Repository.GetAppenders();//shows appenders from my config

if (newFileDialog.ShowDialog() == false)
{
    Log.Fatal("Cancelled dialog");//does not log
    return;
}

var appenders2 = Log.Logger.Repository.GetAppenders();//shows appenders from other process
Log.Fatal("New database selected");//does not log

当我从这些新的附加程序中找到日志文件时,我可以看到我丢失的日志正在那里。

有谁知道这是怎么回事,如何避免?

您必须查看 log4net 调试日志才能了解发生了什么。看起来你有多个地方 configure/reconfigure log4net 并在打开对话框时点击这些地方。

启用内部调试:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appSettings>
        <add key="log4net.Internal.Debug" value="true"/>
    </appSettings>
</configuration>

写入特定文件:

<configuration>
    ...

    <system.diagnostics>
        <trace autoflush="true">
            <listeners>
                <add 
                    name="textWriterTraceListener" 
                    type="System.Diagnostics.TextWriterTraceListener" 
                    initializeData="C:\tmp\log4net.txt" />
            </listeners>
        </trace>
    </system.diagnostics>

    ...
</configuration>