我有几个并发运行的进程,我想记录到同一个文件。
我们一直在使用Enterprise Library 4.1 Logging Application Block(带有RollingFlatFileTraceListener
),它工作正常,除了它在两个进程尝试写入日志文件名时将GUID添加到日志文件名的事实。同时记录日志文件(我相信System.Diagnostics.TextWriterTraceListener
的怪癖)。
我尝试过各种各样的事情,包括在写入日志文件后调用Logger.Writer.Dispose()
,但每次写入日志条目时都不适合进行阻塞调用。
EntLib论坛建议将MSMQ与分销商服务一起使用,但这不是一个选项,因为我的公司不允许使用MSMQ。
还有另一种方法可以快速轻松地从多个线程/进程登录到同一个文件吗?
答案 0 :(得分:4)
很抱歉,但答案是肯定的。 File TraceListeners锁定输出文件,因此只有一个TraceListener可以记录到文件。
您可以尝试其他非基于文件的跟踪侦听器(例如,数据库,事件日志)。
我能想到的另一个选择是编写自己的日志记录服务(进程外),该服务将记录到文件并接受LogEntries。然后创建一个自定义跟踪侦听器,将消息发送到您的服务。
这可能不是一个好主意,因为你会有一些自定义开发加上它可能会影响性能,因为它是一个进程外调用。基本上,您正在设置自己的简化伪分发服务。
答案 1 :(得分:2)
EntLib在写入日志文件时将其锁定。因此,2个进程无法写入同一个日志文件。
当我们遇到这个问题时,我们需要从许多不同的地方登录到同一个地方,我们使用了数据库记录。
如果您100%卡住记录到文本文件,那么您可以登录到单个日志文件,然后编写程序来合并这些文件。
答案 2 :(得分:1)
我知道这是旧的,但如果你仍然好奇。 log4net支持这个:
http://logging.apache.org/log4net/release/faq.html#How do I get multiple process to log to the same file?
答案 3 :(得分:0)
当App Pool重新循环并允许重叠线程时,会出现问题。结束线程仍然打开,新线程得到错误。尝试在IIS中禁用重叠的回收行为,或创建自己的文本编写器版本。