我遇到一个问题,其中log4net挂起在info语句中。我有一个C#多线程控制台应用程序。主线程创建了几个工作线程,使用log4net进行日志记录,写入文件和控制台。记录器是某个基类中的静态变量。在执行应用程序的某个随机点,记录器将挂起在info语句中,但仅在某些计算机上。我遇到一些关于罕见情况的帖子,在特定的系统设置中,日志写入缓冲区将填充,log4net将等待它清空,什么都不会发生。因此应用程序挂起。在我的情况下,记录器写入文件,但随后停止,消息不会到达控制台。按控制台上的ctrl-c实际上会导致应用程序正常继续。
我尝试让记录器成为我的类的成员,而不是按照此处的建议使其保持静态:http://apache-logging.6191.n7.nabble.com/Multi-threaded-ASP-NET-application-not-working-td21782.html
但这只会导致我的应用程序挂起第一个日志声明。
这是挂起的电话:
_logger.Info($"Generation: {_ea.CurrentGeneration}/{_maxGenerations}, " +
$"Time/gen: {timePerGen} ms, Est. time remaining: {Utilities.TimeToString(timeRemainingEst)} " +
$"Fitness - Max: {_ea.Statistics._maxFitness:F4} Mean: {_ea.Statistics._meanFitness:F4}, " +
$"Complexity - Max: {_ea.Statistics._maxComplexity:F0} Mean: {_ea.Statistics._meanComplexity:F2} " +
$"Champ: {_ea.CurrentChampGenome.Complexity:F0} Strategy: {_ea.ComplexityRegulationMode}, " +
$"Specie size - Max: {_ea.Statistics._maxSpecieSize:D} Min: {_ea.Statistics._minSpecieSize:D}, " +
$"Generations since last improvement: {_ea.CurrentGeneration - _lastMaxFitnessImprovementGen}"
);
是否有人遇到类似问题并知道如何解决或解决方法?
这是请求的log4net配置
<log4net>
<appender name="FileAppender" type="log4net.Appender.FileAppender">
<file type="log4net.Util.PatternString" value="ENTM/%property{name}/%property{id}/%property{count}/log.txt" />
<appendToFile value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%utcdate{yyyy-MM-dd HH:mm:ss} [%thread] %-5level: %message%newline" />
</layout>
</appender>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
<target value="Console.Error" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%utcdate{yyyy-MM-dd HH:mm:ss} [%thread] %-5level: %message%newline" />
</layout>
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="FileAppender" />
<appender-ref ref="ConsoleAppender" />
</root>
</log4net>