C# 如何使用log4net为不同的实例登录到不同的日志文件?

C# 如何使用log4net为不同的实例登录到不同的日志文件?,c#,.net,logging,log4net,C#,.net,Logging,Log4net,我正在做一个项目,它可以做到这一点: 主程序使用quartz来安排一些作业。在每个作业中,它启动一个控制台exe程序。控制台程序根据输入参数调用其中一个DLL中的方法,例如Run()。有多个DLL 现在,如果我们将信息记录在事件日志中,它可以正常工作。但是,我们希望使用log4net登录到文件中,并且我们希望每个dll都有自己的日志文件。我是这样做的: 我有一个类MyTask,它有: public void SetLogFile(string name) { // change the

我正在做一个项目,它可以做到这一点:

主程序使用quartz来安排一些作业。在每个作业中,它启动一个控制台exe程序。控制台程序根据输入参数调用其中一个DLL中的方法,例如Run()。有多个DLL

现在,如果我们将信息记录在事件日志中,它可以正常工作。但是,我们希望使用log4net登录到文件中,并且我们希望每个dll都有自己的日志文件。我是这样做的:

我有一个类MyTask,它有:

public void SetLogFile(string name)
{
    // change the log folder for the dll
    XmlConfigurator.Configure();
    log4net.Repository.Hierarchy.Hierarchy h =
    (log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository();
    foreach (IAppender a in h.Root.Appenders)
    {
        if (a is FileAppender)
        {
            FileAppender fa = (FileAppender)a;
            // Programmatically set this to the desired location here
            string logFileLocation = $".\\Logs\\{name}.log";

            fa.File = logFileLocation;
            fa.ActivateOptions();
            break;
        }
    }
}
dll中的每个类都必须从此类中插入。因此,当控制台程序必须首先调用此SetLogFile方法来设置日志文件名,然后调用dll中的Run()

这会生成不同的日志文件。然而,出于某些原因,这似乎会产生某种锁

控制台程序反复运行,并根据计划启动作业。有些作业应该运行10秒,有些作业应该运行60秒,有些作业应该运行120秒(现在,我们只需睡眠#秒来模拟情况)。然而,我注意到一些奇怪的事情。由于每个dll都是从控制台程序调用的,因此我可以在任务管理器中看到控制台程序的多个实例。我还可以看到它们使用的参数(这决定了它将运行多长时间)。但是从任务管理器来看,这些实例似乎不是并行运行的。他们正在有序地运行

我不知道为什么,但我猜日志文件是锁定的,因为DLL是从控制台程序调用的。在log4net配置中,我使用

<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />

但这似乎并不能解决问题。如果我让控制台程序运行很长时间,逐渐地,我可以看到它的许多实例(具有不同的输入参数)。但它们并没有“死”,它们将逐渐退出,而更多的新实例将出现

以前有人有过这个问题吗?如何解决?或者,可能使用另一个日志框架?或者,也许我实现它的方式是错误的?还有其他建议吗


谢谢你看到了吗?我想说,如果可以的话,使用web服务或数据库进行日志记录,或者因为它是windows应用程序。。。windows事件日志?windows事件日志工作正常。但我们想看看log4net是否更好。我们没有使用多个实例登录到同一个日志文件。每个dll使用自己的日志文件。但是来自不同DLL的所有方法都是从同一个控制台程序调用的。这似乎产生了“锁”问题。是否在某个地方抛出了错误?控制台程序调用在其自身实例中包含其自身日志文件的dll不会导致锁定。更可能的情况是您正在运行,这可能是由log4net实现刷新的。我假定控制台应用程序只有一个实例,然后是多个程序集?控制台应用程序是同时加载多个程序集,还是每个程序集执行一个控制台?