【问题标题】:Logging from multiple processes to same file using Enterprise Library 4.1使用 Enterprise Library 4.1 从多个进程记录到同一个文件
【发布时间】:2010-12-16 06:15:20
【问题描述】:

我有多个同时运行的进程要记录到同一个文件。

我们一直在使用 Enterprise Library 4.1 日志记录应用程序块(带有RollingFlatFileTraceListener),它工作正常,除了它在两个进程尝试写入日志文件时在日志文件名前面添加一个 GUID同时(我相信System.Diagnostics.TextWriterTraceListener 的怪癖)。

我尝试了各种方法,包括在写入日志文件后调用Logger.Writer.Dispose(),但每次写入日志条目时都进行阻塞调用并不理想。

EntLib 论坛建议将 MSMQ 与 Distributor Service 一起使用,但这不是一个选项,因为我的公司不允许使用 MSMQ。

有没有其他方法可以快速轻松地从多个线程/进程记录到同一个文件?

【问题讨论】:

  • 您有其他解决方案吗?也许使用 MSMQ
  • @Kiquenet 已经很久了,我不太记得了。如果我真的很努力,我隐约记得我们最终为不同的进程使用了​​不同的日志文件来解决这个问题。这并不理想,但我们想让事情变得简单。
  • 如果我现在必须选择一个日志框架,我可能会补充说,我会尽可能远离企业库。它太复杂了,使用和配置都太复杂了,而且不容易扩展。我可能会选择log4netNLog

标签: c# multithreading logging enterprise-library


【解决方案1】:

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

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

如果您 100% 无法登录到文本文件,那么您可以登录到单个日志文件,然后编写一个程序来合并这些文件。

【讨论】:

  • 即使是同一进程中的 2 个单独的 Trace Listener 也无法登录到同一个文件。
  • 是的,数据库日志记录对我们来说不是一种选择,我们没有。目前,我们确实在处理合并在一起的单个日志文件。但这只是一个短期的解决方法。
【解决方案2】:

很抱歉,但答案是否定的。 File TraceListeners 锁定输出文件,因此只有一个 TraceListener 可以记录到文件。

您可以尝试其他不基于文件的跟踪侦听器(例如数据库、事件日志)。

我能想到的另一个选择是编写自己的日志服务(进程外),该服务将记录到文件并接受 LogEntries。然后创建一个自定义跟踪侦听器,向您的服务发送消息。

这可能不是一个好主意,因为您需要进行一些自定义开发,而且它可能会影响性能,因为它是进程外调用。基本上,您正在设置自己的简化伪分发服务。

【讨论】:

  • 这也是我们得出的相同结论。从长远来看,我们可能会为日志编写一个简单的即发即弃的 WCF 服务,这似乎是唯一可行的选择。可惜。
【解决方案3】:

我知道这是旧的,但如果你仍然好奇的话。 log4net 支持这个:

http://logging.apache.org/log4net/release/faq.html#如何让多个进程登录到同一个文件?

【讨论】:

  • 谢谢。在这个项目上使用 log4net 不是一个选择。如果这是我的决定,我肯定会在 EntLib 上使用它,但 EntLib 日志记录过于臃肿且难以理解。
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多