Hi.

I'm trying to create a database appender which high throughput... I looked
at code in AppenderSekeletion.DoAppend() method and saw following comment:

    public void DoAppend(LoggingEvent loggingEvent)
    {
      // This lock is absolutely critical for correct formatting
      // of the message in a multi-threaded environment.  Without
      // this, the message may be broken up into elements from
      // multiple thread contexts (like get the wrong thread ID).

      lock (this)
      {

I would like to remove this lock from my code but there's a couple of
issues I do not understand:
1. As I do not know the internals of log4net well enough I do not
understand why lock is important for message formatting? Is it because the
Layout.Format is not supposed to be thread safe? Or is it because the same
instance of m_renderWriter could be used by multiple threads (well, usage
of m_renderWriter is protected by another lock, added later. But AFAIK the
RenderLoggingEvent(LoggingEvent loggingEvent) is still not 100% thread safe)
2. The comment does not mention that lock is crucial for m_recursiveGuard
to work correctly. That's my main complaint: I almost overlooked the issue
of potentially skipped logging events.
3. What about implementations of IFilter.Decide? Are those (supposed to be)
thread safe?

Gert

Reply via email to