为什么log4net会抛出LockRecursionException?

时间:2015-06-22 15:49:24

标签: c# logging exception-handling log4net

我从1.2.11将log4net升级到版本1.2.13,现在只要我的应用程序抛出异常,它就会抛出以下异常:

Error: log4net:ERROR Exception while logging
log4net:ERROR Exception while logging
Error: 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.TryEnterReadLock(Int32 millisecondsTimeout)
    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)

当我的应用程序没有抛出异常时,日志记录照常工作。如果有人能够提供有关为什么会发生这种情况的见解,我将非常感激。

2 个答案:

答案 0 :(得分:1)

在我的应用程序中,这显然发生在记录消息时访问记录器时。例如,

private static readonly ILog iLog = LogManager.GetLogger(
    MethodBase.GetCurrentMethod().DeclaringType);

public void Configure(){
    iLog.InfoFormat("Found project '{0}'.", GetProject());
    ... do stuff ...
}


private string GetProject()
{
   string result = null;
   iLog.Debug("Trying to determine project.");
   .... do stuff ...
   return result;
}

除了避免这种情况,我还没有找到解决办法。

编辑:切换到NLog后,日志工作开箱即用,所以我猜这是log4net中的一个错误。顺便说一句,切换很容易,NLog也更容易使用。

答案 1 :(得分:0)

log4net 1.2.14版本似乎修复了这个bug。见in this example

[更新]即使使用1.2.15,我也可以重现这个问题。碰巧我的本地日志DB被填满了,因此多次看到这个错误。