C# dll不同实例的通用log4net日志记录

C# dll不同实例的通用log4net日志记录,c#,.net,dll,log4net,C#,.net,Dll,Log4net,我在配置log4net使其按我想要的方式工作时遇到问题。我的应用程序Mine.exe和第三方应用程序Other.exe都使用类库library.dll。我有另一个类库Util.dll,它由Mine.exe和library.dll使用 Mine.exe和Other.exe并行运行,我希望Library.dll的两个实例使用相同的日志文件。它还应该与Mine.exe的日志文件分开。从Library.dll调用Util.dll时,应记录到Library.dll日志文件,从Mine.exe调用时,应记录

我在配置log4net使其按我想要的方式工作时遇到问题。我的应用程序Mine.exe和第三方应用程序Other.exe都使用类库library.dll。我有另一个类库Util.dll,它由Mine.exe和library.dll使用

Mine.exe和Other.exe并行运行,我希望Library.dll的两个实例使用相同的日志文件。它还应该与Mine.exe的日志文件分开。从Library.dll调用Util.dll时,应记录到Library.dll日志文件,从Mine.exe调用时,应记录到Mine.exe日志文件

编辑:我想这有点难理解,这就是我想要的工作方式:

Mine.exe记录到Mine.log
Other.exe不记录任何内容(第三方应用程序)
Mine.exe->Library.dll记录到C:\Library.log
Other.exe->Library.dll记录到C:\Library.log
Mine.exe->Util.dll日志到Mine.log
Mine.exe->Library.dll->Util.dll日志到C:\Library.log
Other.exe->Library.dll->Util.dll日志到C:\Library.log Other.exe不直接调用Util.dll

首先,我尝试在Library.dll中加载自定义log4net配置,使用:

log4net.Config.XmlConfigurator.Configure(new FileInfo("Library.log4net.config"));
但这导致Mine.exe也会登录到Library.dll日志文件

然后,我尝试在Library.dll中添加以下程序集属性:

[assembly: log4net.Config.Repository("Library")]
这会使日志保持独立,但即使从Library.dll调用,Util.dll也会记录到Mine.exe日志文件中。我想我可以在Util.dll中使用Repository(“Util”),在Library.dll中使用AliasReposity(“Util”,“Library”),在Mine.exe中使用AliasReposity(“Util”,“Mine”),但实际上我在这个项目中有很多类库,我不想这样做

有什么办法让它工作吗


/Andreas

老实说,我不会共享日志文件。如果从两个进程登录到一个文件,可能会遇到各种线程问题。通常情况下,如果另一个log4net实例无法记录日志,那么它将导致日志条目丢失。另外,如果它们在同一个日志文件中,则需要在日志格式化程序中丢弃进程名称,以便知道源。听起来很复杂。按照惯例,我通常会做以下工作:

  • 在每个进程中引用相同的log4net dllin
  • 分别在process1.exe.config和process2.exe.config中创建log4net配置节
  • 在每个配置中分别为process1.exe.log和process2.exe.log添加一个文件追加器

您可以为两个进程获得两个文件,但这更易于管理。您可以使用日志文件监视程序,它可以同时显示两个日志(尽管我倾向于不使用这种方法),例如:

老实说,我不会共享日志文件。如果从两个进程登录到一个文件,可能会遇到各种线程问题。通常情况下,如果另一个log4net实例无法记录日志,那么它将导致日志条目丢失。另外,如果它们在同一个日志文件中,则需要在日志格式化程序中丢弃进程名称,以便知道源。听起来很复杂。按照惯例,我通常会做以下工作:

  • 在每个进程中引用相同的log4net dllin
  • 分别在process1.exe.config和process2.exe.config中创建log4net配置节
  • 在每个配置中分别为process1.exe.log和process2.exe.log添加一个文件追加器

您可以为两个进程获得两个文件,但这更易于管理。您可以让日志文件监视程序同时显示两个日志(尽管我不倾向于使用这种方法),例如:

让我确保我的回答是:您希望Main和Other的库记录到日志文件“A”,但我和Other自己记录到文件“B”和“C”,你应该复习你的问题。似乎与(至少)文件扩展名(Library.exe与Library.dll)有些混淆。此外,您可能应该考虑从应用程序(即exe)的角度进行日志记录。也就是说,将所有内容从单个应用程序记录到单个日志文件中,而不管它使用的是DLL。Mine.exe+所有DLL登录到,比如说,“Mine.log”。Other.exe+所有DLL记录到“Other.log”。看起来更直观,但当然这只是我的2 ct.:-)是的,我把分机弄错了,现在修好了。我希望从Library.exe获得一个公共日志的原因是,它几乎像一个单独的应用程序,我希望将日志记录交织在一个文件中。在旧的COM时代,我可能会让它成为进程外服务器,而不是dll。让我确保我有一个直截了当的想法:你想让Main和Other的库记录到日志文件“a”,但我和Other自己记录到文件“B”和“C”,并将Util记录到任何程序的日志文件中?你应该回顾一下你的问题。似乎与(至少)文件扩展名(Library.exe与Library.dll)有些混淆。此外,您可能应该考虑从应用程序(即exe)的角度进行日志记录。也就是说,将所有内容从单个应用程序记录到单个日志文件中,而不管它使用的是DLL。Mine.exe+所有DLL登录到,比如说,“Mine.log”。Other.exe+所有DLL记录到“Other.log”。看起来更直观,但当然这只是我的2 ct.:-)是的,我把分机弄错了,现在修好了。我希望从Library.exe获得一个公共日志的原因是,它几乎像一个单独的应用程序,我希望将日志记录交织在一个文件中。在旧的COM时代,我可能会将其作为进程外服务器而不是dll。我推迟了将Util.dll与Library.dll一起记录的要求,并使用了Repository属性。每次运行一个Mine.exe和其他.exe时,它工作正常,但同时运行应用程序时,只有第一个启动的应用程序才能在文件中获得任何日志。我推迟了Util.dll与Library.dll一起记录的要求,并使用了存储库属性