c# - 在 asp.net core 3.1 中使用 log4net 和 Microknights 登录数据库无效

标签 c# log4net asp.net-core-3.1 adonetappender

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

我正在尝试使用相同的方法在 .net core 3.1 应用程序中实现数据库日志记录,但仍然没有成功。

我放在根目录下的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>

我的 startup.cs 文件调用 AddLog4Net() 方法。

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory)
        {
            loggerFactory.AddLog4Net();
}

我正在尝试登录数据库是这样的,

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"/>

您可以在此处找到更多详细信息 microknights/Log4NetAdoNetAppender Github README.md

关于c# - 在 asp.net core 3.1 中使用 log4net 和 Microknights 登录数据库无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60897550/

相关文章:

c# - 通用类型的类型删除,更好地替代动态

c# - 在 DataTemplate 中声明的 View 在从 Tab 更改为 Tab 时继续创建

c# - JWT Token 访问 AuthenticatedUser

asp.net-core-3.1 - 在中间件中更改 Asp.Net Core 3.1 中的 RouteData

c# - 登录 ASP.NET Core 3.1 后如何获取用户信息

c# - 如何保护 SQL Server 数据库和 c# 管理工具之间的通信?

c# - 需要有关 LINQ to SQL WHERE-clause on foreign table 的帮助

c# - Log4Net 的附加组件

c# - 为什么 Log4Net 条目位于不同项目的日志文件中?

c# - 在此模式下不允许 Log4net 递归读取锁定获取