为什么log4net不能通过终结方法进行记录?

问题描述 投票:0回答:1

我没有找到任何文档以及关于log4net为什么在Finalize方法中不起作用的任何问题。我做了一个显示问题的小例子:

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

和log4net fconfig文件

<?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>

执行上述代码后,我在控制台中获得以下结果:

hello
2020-04-07 12:36:24,678 [1] INFO  - hello
finalize

您知道这是否正常吗? Finalize方法中可以使用log4net吗?

.net vb.net log4net
1个回答
0
投票

“最后”,我发现了为什么没有日志记录。在主程序结束后调用finalize方法。如果在运行主程序时调用Finalise,则log4net有效。请参见下面的示例。

Module LoggerTest
    Private ReadOnly logger As log4net.ILog = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType)

    Public Sub Main()
        log4net.Config.XmlConfigurator.Configure(New System.IO.FileInfo("LoggerTest.log4net"))

        Dim c As New HelloTest
        c.SayHello()
        c = Nothing
        GC.Collect()
        GC.WaitForPendingFinalizers()
        Thread.Sleep(2000)
        logger.Info("Goodbye")
    End Sub
End Module

Class HelloTest
    Private Shared ReadOnly logger As log4net.ILog = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType)

    Public Sub SayHello()
        System.Console.WriteLine("hello")
        logger.Info("hello")
    End Sub

    Protected Overrides Sub Finalize()
        logger.Info("finalize")
        System.Console.WriteLine("finalize")
    End Sub
End Class

执行后,我得到以下结果:

hello
2020-04-08 09:48:20,137 [LoggerTest.HelloTest] INFO  - hello
2020-04-08 09:48:20,153 [LoggerTest.HelloTest] INFO  - finalize
finalize
2020-04-08 09:48:22,169 [LoggerTest.LoggerTest] INFO  - Goodbye
© www.soinside.com 2019 - 2024. All rights reserved.