在这种模式下不允许递归读锁获取

本文关键字:递归 读锁 获取 不允许 模式 | 更新日期: 2023-09-27 18:08:58

我有一个自定义的log4net appender,看起来像这样:

public class MyAppender : AppenderSkeleton
{
    protected override void Append(LoggingEvent loggingEvent)
    {
        try
        {
            if (loggingEvent.Level == Level.Error || loggingEvent.Level == Level.Fatal)
            {
                DoWork(RenderLoggingEvent(loggingEvent));
            }
        }
        catch
        {
            // silently fail 
        }
    }
}
每隔一段时间,我就会在输出中看到这个异常:
log4net:ERROR Exception while logging
System.Threading.LockRecursionException: Recursive read lock acquisitions not allowed in this mode.
   at System.Threading.ReaderWriterLockSlim.TryEnterReadLockCore(TimeoutTracker timeout)
   at System.Threading.ReaderWriterLockSlim.TryEnterReadLock(TimeoutTracker timeout)
   at System.Threading.ReaderWriterLockSlim.EnterReadLock()
   at log4net.Util.ReaderWriterLock.AcquireReaderLock()
   at log4net.Repository.Hierarchy.Logger.CallAppenders(LoggingEvent loggingEvent)
   at log4net.Repository.Hierarchy.Logger.ForcedLog(Type callerStackBoundaryDeclaringType, Level level, Object message, Exception exception)
   at log4net.Repository.Hierarchy.Logger.Log(Type callerStackBoundaryDeclaringType, Level level, Object message, Exception exception)

appender似乎工作得很好,我的应用程序没有显示任何错误,但这些消息是如此恼人。我喜欢干净运行的软件,而这个不干净=(

)

我的appender实现ok吗?我可以包括一些配置来避免这个错误吗?我能从google上找到的最接近的答案是这个bug报告log4net bug。我没有调用GetAppenders,所以它不适用于我的用例。

在这种模式下不允许递归读锁获取

在我的例子中,这发生在我的Appender调用正在记录日志的代码时。因此,发生了递归日志记录。如下图所示:

-> Appender -> MyClassThatLogs -> Appender -> MyClassThatLogs -> etc...

请参阅这篇文章:自定义log4net appender中的日志记录/错误处理