views:

976

answers:

3

I have several processes running concurrently that I want to log to the same file.

We have been using Enterprise Library 4.1 Logging Application Block (with a RollingFlatFileTraceListener), and it works fine, apart from the fact that it prepends a GUID to the log file name when two processes try to write to the log file at the same time (a quirk of System.Diagnostics.TextWriterTraceListener I believe).

I've tried various things, including calling Logger.Writer.Dispose() after writing to the log file, but it's not ideal to do a blocking call each time a log entry is being written.

The EntLib forums suggest using MSMQ with a Distributor Service, but that is not an option as MSMQ is not allowed at my company.

Is there another way I can quickly and easily log from multiple threads/processes to the same file?

+2  A: 

EntLib locks the log file when it writes to it. Therefore, 2 processes cannot write to the same log file.

When we have had this problem, that we needed to log from many difference places, to the same place, we have used database logging.

If you are 100% stuck logging to a text file, then you could log to individual log files, and then write a program to merge these files.

Shiraz Bhaiji
Even 2 separate Trace Listeners in the same process cannot log to the same file.
Tuzo
Yeah, database logging is not an option for us, we don't have one. For the moment we are indeed going with individual log files that we merge together. But that will be just a short-term workaround.
Riko
+1  A: 

Sorry to say but the answer is no. The File TraceListeners lock the output file so only one TraceListener can log to a file. I think Log4Net also suffers from this limitation.

You can try other Trace Listeners that are not file based (e.g. Database, Event Log).

Another option I can think of would be to write your own logging service (out of process) that would log to the file and accepts LogEntries. Then create a custom trace listener that sends a message to your service.

It might not be a good idea since you would have a bit of custom development plus it could impact performance since it is an out of process call. Basically you are setting up your own simplified-pseudo-distributor-service.

Tuzo
This is the same conclusion we came to as well. In the longer term we will probably write a simple fire-and-forget WCF service for logging, it seems the only other workable option. Pity though.
Riko
Yes, fire and forget. EL has a lot of functionality and it seems to cover so many scenarios...but it always seems like the one you want is not supported. :(
Tuzo
A: 

I know this is old, but if you are still curious. log4net supports this:

http://logging.apache.org/log4net/release/faq.html#How do I get multiple process to log to the same file?
Adam
Thanks. Using log4net on this project wasn't an option. If it were my decision I would definitely use it over EntLib though, EntLib logging is way too bloated and hard to understand.
Riko