Почему log 4net не входит в метод finalize? - PullRequest
0 голосов
/ 07 апреля 2020

Я не нашел ни одного документа и ни одного вопроса о том, почему журнал 4net не работает в методе 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

и файл журнала 4net 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

Знаете ли вы, это нормально? Можно ли использовать метод log 4net внутри Finalize?

1 Ответ

0 голосов
/ 08 апреля 2020

«Наконец-то» я обнаружил, почему не было ведения журнала. Метод finalize был вызван после окончания основной программы. Если при запуске основной программы вызывается Finalise, журнал 4net работает. См. Пример ниже.

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