在ASP.NET Core应用程序中配置log4net AdoNetAppender

3

我正在尝试使用MicroKnights AdoNetAppender(nuget第三方库)配置log4net,用于我的asp.net核心应用程序。但是,数据库中没有记录任何内容。而且在运行应用程序时没有出现任何错误。我怀疑connectionType是导致问题的原因。

log4net配置文件:

    <log4net>
  <appender name="AdoNetAppender" type="MicroKnights.Logging.AdoNetAppender, MicroKnights.Log4NetAdoNetAppender">
    <bufferSize value="1" />
    <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=4.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    <connectionStringName value="log4net" />
    <connectionStringFile value="appsettings.json" />
    <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
    <parameter>
      <parameterName value="@log_date" />
      <dbType value="DateTime" />
      <layout type="log4net.Layout.RawTimeStampLayout" />
    </parameter>
    <parameter>
      <parameterName value="@thread" />
      <dbType value="String" />
      <size value="255" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%thread" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@log_level" />
      <dbType value="String" />
      <size value="50" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%level" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@logger" />
      <dbType value="String" />
      <size value="255" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%logger" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@message" />
      <dbType value="String" />
      <size value="4000" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%message" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@exception" />
      <dbType value="String" />
      <size value="2000" />
      <layout type="log4net.Layout.ExceptionLayout" />
    </parameter>
  </appender>
  <root>
    <level value="ALL" />
    <appender-ref ref="AdoNetAppender" />
  </root>
</log4net>

appsettings.json:

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*",
  "connectionStrings": {
    "log4net": "Server=[[ServerName]]; Database=[[DatabaseName]]; Trusted_Connection=True; MultipleActiveResultSets=true"
  }
}

程序.cs中的主方法

 public static void Main(string[] args)
        {
            var logRepository = LogManager.GetRepository(Assembly.GetEntryAssembly());
            XmlConfigurator.Configure(logRepository, new FileInfo("log4net.config"));

            ILog log = log4net.LogManager.GetLogger("Logger");

            log.Info("logging to database");

            CreateWebHostBuilder(args).Build().Run();
        }

任何帮助都将不胜感激。

2个回答

9

尝试将debug属性添加到log4net根元素中。

<log4net debug="true">

这将使您在运行应用程序时看到调试输出。我使用您提供的示例进行了这项操作,它报告了连接类型错误。

log4net: Setting Collection Property [AddParameter] to object [MicroKnights.Logging.AdoNetAppenderParameter]
log4net:ERROR [AdoNetAppender] ErrorCode: GenericFailure. Failed to load connection type [System.Data.SqlClient.SqlConnection, System.Data, Version=4.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a]
System.IO.FileLoadException: Could not load file or assembly 'System.Data, Version=4.4.0.65535, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
File name: 'System.Data, Version=4.4.0.65535, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
   at System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMarkHandle stackMark, IntPtr pPrivHostBinder, Boolean loadTypeFromPartialName, ObjectHandleOnStack type, ObjectHandleOnStack keepalive)
   at System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean loadTypeFromPartialName)
   at System.RuntimeType.GetType(String typeName, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark)
   at System.Type.GetType(String typeName, Boolean throwOnError, Boolean ignoreCase)
   at log4net.Util.SystemInfo.GetTypeFromString(Assembly relativeAssembly, String typeName, Boolean throwOnError, Boolean ignoreCase)
   at MicroKnights.Logging.AdoNetAppender.ResolveConnectionType()

我猜想如果您更改这一行
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=4.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />

为了

<connectionType value="System.Data.SqlClient.SqlConnection, System.Data" />

它将会工作。在MicroKnights的版本1.0.2中做了一些更改,使用了可用的System.Data.SqlClient版本。


谢谢!我使用了错误的表名。在添加调试属性后,我能够识别出来。 - user2443401
它完美地运行了,我的问题是我给了 connectionStringName 错误的值。 - Shelly
这不是我的问题,但使用输出窗口帮助我解决了我的问题。谢谢。 - biso
1
在 .net 5 中,那个更改将不起作用。但是,我通过执行 typeof(SqlConnection).AssemblyQualifiedName 找到了正确的 ConnectionType,并使用其输出。请参见:https://github.com/microknights/Log4NetAdoNetAppender/issues/1#issuecomment-385940980 - carraua

1
在 .net core 3.1 中,我通过以下方式使其工作:
<connectionType value="Microsoft.Data.SqlClient.SqlConnection, Microsoft.Data.SqlClient" />

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接