2009-11-13 42 views
8

我有几个进程同时运行,我想登录到同一个文件。使用企业库从多个进程记录到同一文件4.1

我们一直在使用企业库4.1日志记录应用程序块(使用RollingFlatFileTraceListener),并且它工作正常,除了当两个进程尝试写入日志文件时,它将GUID预先记录到日志文件名同一时间(我相信System.Diagnostics.TextWriterTraceListener怪癖)。

我已经尝试了各种各样的东西,包括在写入日志文件后调用Logger.Writer.Dispose(),但是每次写入日志条目时都会发生阻塞调用,这并不理想。

EntLib论坛建议在分销商服务中使用MSMQ,但这不是一个选项,因为MSMQ在我的公司不允许。

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

+0

你有没有得到替代解决方案?也许使用*** MSMQ ***? – Kiquenet 2016-03-08 14:06:22

+0

@Kiquenet已经这么久了,我不记得了。如果我真的努力尝试,我依稀记得我们最终使用不同的日志文件来处理这个问题。这并不理想,但我们希望保持简单。 – Riko 2016-03-22 17:43:30

+0

如果我现在必须选择一个日志记录框架,我可能会添加,但我会尽可能远离Enterprise Library。这太复杂了,无论是使用还是配置,都不容易扩展。我可能会使用[log4net](https://logging.apache.org/log4net/)或[NLog](http://nlog-project.org/)。 – Riko 2016-03-22 17:50:52

回答

4

对不起,但答案是否定的。文件TraceListeners锁定输出文件,因此只有一个TraceListener可以登录到文件。

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

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

这可能不是一个好主意,因为您会进行一些自定义开发,再加上它可能会影响性能,因为它是一个过程调用。基本上你正在建立你自己的简化的伪分发服务。

+0

这也是我们同样的结论。从长远来看,我们可能会编写一个简单的“即燃即用”WCF服务进行日志记录,这似乎是唯一可行的选项。 虽然可惜。 – Riko 2009-11-16 10:13:53

2

EntLib在写入日志文件时锁定日志文件。因此,2个进程无法写入相同的日志文件。

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

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

+0

即使在同一个进程中,2个独立的Trace Listeners也不能登录到同一个文件。 – 2009-11-13 16:02:13

+0

是的,数据库日志不是我们的选择,我们没有。目前我们确实正在使用我们合并在一起的单个日志文件。但这只是一个短期的解决方法。 – Riko 2009-11-16 10:11:42

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日志过于臃肿,难以理解。 – Riko 2010-08-09 11:27:31

0

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