Description
Log4Net do not log while it's called from Finalize method. It particularly annoying if we want monitor destroyed object which was not closed (without call to Close method). Inside of Finalize method the logger object is not null but has no effect.
Example:
Class LoggerTest Private ReadOnly logger As log4net.ILog = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType) Public Shared Sub Main() log4net.Config.XmlConfigurator.Configure(New System.IO.FileInfo("LoggerTest.log4net")) Dim c As New LoggerTest c.SayHello() End Sub Public Sub SayHello() System.Console.WriteLine("hello") logger.Info("hello") End Sub Protected Overrides Sub Finalize() System.Console.WriteLine("finalize") logger.Info("finalize") End Sub End Class
Config file
<?xml version="1.0" encoding="utf-8" ?> <configuration> <log4net> <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level - %message%newline" /> </layout> </appender> <root> <level value="ALL"/> <appender-ref ref="ConsoleAppender"/> </root> </log4net> </configuration>
Result:
hello 2020-04-07 15:33:30,399 [1] INFO - hello finalize