Logging from multiple processes to same file using Enterprise Library 4.1

rikoe picture rikoe · Nov 13, 2009 · Viewed 8.9k times · Source

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?

Answer

Randy supports Monica picture Randy supports Monica · Nov 13, 2009

Sorry to say but the answer is no. The File TraceListeners lock the output file so only one TraceListener can log to a file.

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.