Log4Net GetLogger甚至为未引用的文件创建滚动文件

时间:2010-04-07 10:04:52

标签: log4net

我有一个包含三个可执行文件的C#解决方案。我让这三个可执行文件中的每一个共享相同的log4net配置文件。在启动每个可执行文件时,它们检索一个记录器(每个可执行文件一个记录器,根据下面的配置文件)。当其中一个可执行文件执行Log.GetLogger()时,它会创建所有滚动文件,而不是只执行可执行文件记录器配置中称为appender-ref的滚动文件。

例如,当我启动发送守护程序可执行文件时,它执行Log.GetLogger(“SendingDaemonLogger”),它创建3个文件Log / RuleScheduler.txt,Log / NotificationGenerator.txt和Log / NotificationSender.txt而不是只需要登录/ NotificationSender.txt。

然后当我启动另一个可执行文件时,例如规则调度程序守护程序,这个其他进程无法在Log / RuleScheduler.txt中写入,因为它已由发送守护程序进程创建并锁定。

我猜我的问题可能有三种不同的解决方案:

  1. GetLogger应该只创建配置中引用的滚动文件追加器

  2. 每个可执行文件应该有一个配置文件,这样每个配置文件只能列出一个滚动文件appender并且启动每个可执行文件不会创建其他守护进程的滚动文件。然而,我不愿意这样做,因为一些配置(SMTP appender,控制台appender)在守护进程之间共享,我不希望有重复的副​​本来维护。除非有办法让配置文件包含另一个?

  3. 也许有一种方法可以配置滚动文件,以便允许跨进程的并发访问?在我看来,这个解决方案仍然不完美,因为任何守护进程都不应该创建其他守护进程的滚动文件。

  4. 提前感谢您的帮助!

    我在这里正确发布配置文件有困难(本网站解释为HTML)。请访问以下链接查看我的log4net配置文件: log4Net configuration file

2 个答案:

答案 0 :(得分:1)

迟到总比不上......

对文件追加器使用以下文件名定义。 启动时会使用appdomains友好名称替换%appdomain。 现在,您可以为多个应用程序使用完全相同的配置文件,并且仍然具有单独的日志文件。无需配置多个appender ......

<file  type="log4net.Util.PatternString" value="C:\logs\%appdomain.log" />

请参阅PatternString documentation了解可用的模式。

答案 1 :(得分:0)

我认为所有3个文件都是根据answer中给出的原因创建的。虽然您可以编写自己的appender但不显示此行为,但这是不可取的。这使您可以拥有3个单独的配置文件或配置最小锁定:

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

我对后者没有经验,所以我不能告诉你这有多好。我可能会选择三个单独的配置文件。