在这种模式下不允许递归读锁获取
本文关键字:递归 读锁 获取 不允许 模式 | 更新日期: 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中的日志记录/错误处理