Loggers are not fully re-entrant and can deadlock -------------------------------------------------
Key: LOG4NET-298 URL: https://issues.apache.org/jira/browse/LOG4NET-298 Project: Log4net Issue Type: Bug Components: Appenders Affects Versions: 1.2.10 Reporter: Tanguy Fautre Log4net internal locking seems to be too aggressive and coarse. It can deadlock in cases where a logging thread waits on another thread that also logs. While this is a similar issue to LOG4NET-225, there is no custom appender needed to reproduce it. For example, the following program will deadlock in .\log4net-1.2.10\src\Appender\AppenderSkeleton.cs (AppenderSkeleton.DoAppend(), line 296) using System.Threading.Tasks; using log4net; using log4net.Appender; using log4net.Core; using log4net.Layout; using log4net.Repository.Hierarchy; namespace HelloWorldCSharp { public class Program { private static readonly ILog Log = LogManager.GetLogger("My.Logger"); private static void InitLogger() { var appender = new ConsoleAppender { Name = "Unit Testing Console Appender", Layout = new PatternLayout("%message%n"), Threshold = Level.All }; appender.ActivateOptions(); var root = ((Hierarchy)LogManager.GetRepository()).Root; root.Level = Level.Debug; root.AddAppender(appender); root.Repository.Configured = true; } public static void Main() { InitLogger(); Log.WarnFormat("Nasty thing {0}", new NastyThing()); } private class NastyThing { public override string ToString() { Log.Warn("This message goes missing"); var t = Task.Factory.StartNew(DoLoggingInOtherThread); t.Wait(); // this deadlock deep in log4net return "NastyThing.ToString()"; } } public static void DoLoggingInOtherThread() { Log.Warn("This message deadlocks"); } } } Current behaviour: - prints nothing - deadlocks Expected behaviour: - prints "This message goes missing" - prints "This message deadlocks" - prints "Nasty thing NastyThing.ToString()" - exits cleanly Having looked at the code from SkeletonAppender, I understand this may not be a trivial issue to fix. I feel however that this is a reasonable user expectation (especially given the fact that the use case above is read-only and makes no attempt to modify the log tree). Cheers, Tanguy -- This message is automatically generated by JIRA. For more information on JIRA, see: http://www.atlassian.com/software/jira