C# 使用asp.net core 3.1中的log4net和Microknights登录数据库;行不通

C# 使用asp.net core 3.1中的log4net和Microknights登录数据库;行不通,c#,log4net,asp.net-core-3.1,adonetappender,C#,Log4net,Asp.net Core 3.1,Adonetappender,我看过很多文章说.NETCore不支持AdoNetAppender,但是我们可以使用MicroKnights来做同样的事情 我正在尝试使用相同的方法在.NETCore3.1应用程序中实现DB登录,但仍然没有成功 我放在根目录中的log4net.config文件如下所示: <?xml version="1.0" encoding="utf-8"?> <configuration> <configSections> <section n

我看过很多文章说.NETCore不支持AdoNetAppender,但是我们可以使用MicroKnights来做同样的事情

我正在尝试使用相同的方法在.NETCore3.1应用程序中实现DB登录,但仍然没有成功

我放在根目录中的log4net.config文件如下所示:

    <?xml version="1.0" encoding="utf-8"?>
<configuration>

  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>

  <log4net debug="true">
<appender name="AdoNetAppender" type="MicroKnights.Logging.AdoNetAppender, MicroKnights.Log4NetAdoNetAppender">
      <bufferSize value="1" />
      <connectionType value="System.Data.SqlClient.SqlConnection,System.Data.SqlClient,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089" />
      <connectionStringName value="log4net" />
      <connectionStringFile value="appsettings.json" />
      <commandText value="INSERT INTO ApplicationLog(ApplicationID, CreateDate, LogLevel, Message, Exception)
    VALUES (@ApplicationID, @CreateDate, @LogLevel, @Message, NULLIF(@Exception,''))" />
      <!--<commandText value="dbo.sp_InsertApplicationLog" />
      <commandType value="StoredProcedure" />-->
      <parameter name="ApplicationID">
        <parameterName value="@ApplicationID" />
        <dbType value="Int16" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%property{ApplicationID}" />
        </layout>
      </parameter>
      <parameter name="CreateDate">
        <parameterName value="@CreateDate" />
        <dbType value="DateTime" />
        <layout type="log4net.Layout.RawTimeStampLayout" />
      </parameter>
      <parameter name="LogLevel">
        <parameterName value="@LogLevel" />
        <dbType value="AnsiString" />
        <size value="20" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%level" />
        </layout>
      </parameter>
      <parameter name="Message">
        <parameterName value="@Message" />
        <dbType value="AnsiString" />
        <size value="2000" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%message" />
        </layout>
      </parameter>
      <parameter name="Exception">
        <parameterName value="@Exception" />
        <dbType value="AnsiString" />
        <size value="4000" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%exception" />
        </layout>
      </parameter>
      <threshold value="DEBUG"/>
      <filter type="log4net.Filter.LevelRangeFilter">
        <levelMin value="DEBUG" />
        <levelMax value="ERROR" />
      </filter>
    </appender>
    <!--<root>
      <level value="DEBUG" />
      <appender-ref ref="RollingFileAppender" />
      <appender-ref ref="AdoNetAppender" />
    </root>-->
    <root>
      <level value="ALL"/>
      <appender-ref ref="RollingFileAppender" />
      <appender-ref ref="AdoNetAppender" />
    </root>
  </log4net>

</configuration>
我试着登录数据库是这样的

private static readonly string LOG_CONFIG_FILE = @"log4net.config";
private static readonly ILog log = LogManager.GetLogger(typeof(Log4NetLoggingService));

private static void SetLog4NetConfiguration()
        {
            XmlDocument log4netConfig = new XmlDocument();
            log4netConfig.Load(File.OpenRead(LOG_CONFIG_FILE));

            var repo = LogManager.CreateRepository(
                Assembly.GetEntryAssembly(), typeof(log4net.Repository.Hierarchy.Hierarchy));

            log4net.Config.XmlConfigurator.Configure(repo, log4netConfig["log4net"]);

            AdoNetAppenderHelper.SetConnectionString(Configuration
                                .GetSection("Data:Logging")
                                .GetSection("DbConnectionString").Value);
        }

public void LogError(Exception exception)
        {

                var message = string.IsNullOrEmpty(exception.Source) ? exception.Message : exception.Source;

                SetLog4NetConfiguration();
                log.Error(message, exception);

        }

我无法理解我错在哪里,但我尽了最大努力但没有成功。

对于.Net Core 3.1,Microsoft已更改了SqlClient库的路径。 因此,必须将log4net.config中的connectionType元素更新为:

<connectionType value="Microsoft.Data.SqlClient.SqlConnection, Microsoft.Data.SqlClient, Version=1.0.0.0,Culture=neutral,PublicKeyToken=23ec7fc2d6eaa4a5"/>


您可以在此处找到更多详细信息

您是否能够调试SetLog4NetConfiguration()和
LogError
方法的代码?SetLog4NetConfiguration()运行正常,没有引发异常,log.Error()方法也能正确调试,但它没有在数据库中创建任何条目。这可能对你有帮助
<connectionType value="Microsoft.Data.SqlClient.SqlConnection, Microsoft.Data.SqlClient, Version=1.0.0.0,Culture=neutral,PublicKeyToken=23ec7fc2d6eaa4a5"/>