[
https://issues.apache.org/jira/browse/LOG4NET-298?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Stefan Bodewig updated LOG4NET-298:
-----------------------------------
Fix Version/s: 1.2 Maintenance Release
> 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
> Fix For: 1.2 Maintenance Release
>
>
> 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