使用企业库4.1将多个进程的日志记录到同一个文件中

8
我有几个同时运行的进程,我想将它们的日志记录到同一个文件中。
我们一直在使用Enterprise Library 4.1 Logging Application Block(带有RollingFlatFileTraceListener),它工作得很好,除了当两个进程尝试同时写入日志文件时,它会在日志文件名前加上GUID(我认为这是System.Diagnostics.TextWriterTraceListener的一个怪癖)。
我尝试过各种方法,包括在写入日志文件后调用Logger.Writer.Dispose(),但每次写入日志条目时进行阻塞调用并不理想。
EntLib论坛建议使用具有Distributor Service的MSMQ,但由于我的公司不允许使用MSMQ,因此这不是一个选项。
还有其他快速简便的方法可以从多个线程/进程记录到同一个文件中吗?

你有没有得到其他的解决方案?也许可以使用MSMQ? - Kiquenet
@Kiquenet,好久不见了,我有点记不清了。如果我努力回忆,我依稀记得我们最终使用了不同的日志文件来处理这个问题。虽然这并不是理想的解决方案,但我们希望保持简单。 - rikoe
如果我现在必须选择一个日志框架,我会尽可能远离Enterprise Library。它太复杂了,无论是使用还是配置都很困难,而且不容易扩展。我可能会选择log4net或NLog。 - rikoe
4个回答

5
很抱歉,答案是否定的。文件跟踪侦听器锁定输出文件,因此只有一个跟踪侦听器可以记录到文件中。
您可以尝试其他不基于文件的跟踪侦听器(例如数据库、事件日志)。
我能想到的另一个选择是编写自己的日志记录服务(作为进程外部),该服务将记录到文件并接受日志条目。然后创建一个自定义跟踪侦听器,该侦听器向您的服务发送消息。
这可能不是一个好主意,因为您需要进行一些自定义开发,而且由于这是一个进程外部调用,它可能会影响性能。基本上,您正在设置自己的简化伪分发服务。

这也是我们得出的相同结论。从长远来看,我们可能会编写一个简单的“fire-and-forget” WCF服务来记录日志,这似乎是唯一可行的选择。可惜啊。 - rikoe

2

EntLib在写入日志文件时会锁定该文件。因此,两个进程不能同时写入同一个日志文件。

当我们遇到需要从许多不同的地方记录到同一位置的问题时,我们使用数据库日志记录。

如果您必须要将日志记录到文本文件中,那么您可以将日志记录到单独的日志文件中,然后编写一个程序来合并这些文件。


同一进程中的两个不同Trace Listeners 无法记录到同一个文件。 - Randy Levy
是的,数据库日志记录对我们来说不是一个选择,因为我们没有这个。目前,我们确实使用单独的日志文件,然后将它们合并在一起。但这只是一个短期的解决方法。 - rikoe

1

我知道这是老问题了,但如果你还是有兴趣的话。log4net支持这个功能:

http://logging.apache.org/log4net/release/faq.html#How do I get multiple process to log to the same file?

1
谢谢。在这个项目中使用log4net不是一个选项。如果是我的决定,我肯定会选择它而不是EntLib,因为EntLib日志记录过于臃肿且难以理解。 - rikoe

0
当应用程序池回收并允许重叠线程时,问题就会出现。关闭的线程仍然保持打开状态,新线程会出现错误。尝试在IIS中禁用重叠回收行为,或创建自己的文本编写器版本。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接