2011-03-28 57 views
1

我无法配置log4net以按我想要的方式工作。我有一个类库库Library.dll,用于我的应用程序Mine.exe和第三方应用程序Other.exe。我有Mine.exe和Library.dll都使用的另一个类库Util.dll。针对不同dll实例的常见log4net日志记录

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")] 

即保持日志分开,但是随后Util.dll记录到从Library.dll称为即使当Mine.exe日志文件。我想我可以在Mine.dll中使用Util.dll中的Repository(“Util”),Library.dll中的AliasReposity(“Util”,“Library”)和AliasReposity(“Util”,“Mine”),但我实际上有很多该项目中的类库,而不是沿着这条路线走下去。

有关如何使这项工作的任何想法?

/Andreas

+0

让我确保我有这样的直观:您希望Main和Other的库登录到日志文件“ A“,但是我和他们自己可以登录到文件”B“和”C“,并将Util用于任何程序的日志文件中,称为它? – 2011-03-28 20:20:40

+0

你应该检查你的问题。似乎有(至少)文件扩展名(Library.exe与Library.dll)混合。另外,您可能应该考虑从应用程序(即exe)的角度进行日志记录。也就是说,无论所使用的DLL如何,都将单个应用程序中的所有内容记录到单个日志文件中。 Mine.exe +所有的DLL登录到,比如说“Mine.log”。 Other.exe +所有DLL登录到“Other.log”。看起来更直观,但当然这只是我的2克拉。 :-) – 2011-03-29 05:32:38

+0

是的,我得到了扩展混淆,现在修复。我想从Library.exe生成一个通用日志的原因是,它几乎就像一个单独的应用程序,我希望日志交织在一个文件中。在旧的COM时代,我可能已经将它变成了一个进程外服务器而不是一个dll。 – Anlo 2011-03-29 06:43:21

回答

1

我不会分享日志文件的说实话。如果您从两个进程登录文件,可能会遇到各种线程问题。通常,一个log4net实例将无法记录另一个log4net实例,因此它会导致日志条目丢失。同样,如果它们在同一个日志文件中,则需要在日志格式化程序中查找进程名称,以便知道源代码。听起来很复杂。按照惯例,我通常会执行以下操作:

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

您为两个进程获得两个文件,但这更容易管理。您可以获取可以同时显示两个日志的日志文件观察器(尽管我倾向于不使用该方法),例如:http://tailforwin32.sourceforge.net/

+0

我推迟了与Library.dll一起记录Util.dll的需求,并使用了Repository属性。当一次运行Mine.exe和Other.exe时,它运行良好,但是当同时运行应用程序时,只有第一个应用程序开始在文件中获取任何日志。 – Anlo 2011-04-01 07:21:32