c# - 在 asp.net 核心应用程序中配置 log4net AdoNetAppender
问题描述
我正在尝试使用 MicroKnights AdoNetAppender(nuget 3rd party library) 为我的 asp.net 核心应用程序配置 log4net。但是没有任何东西登录数据库。运行应用程序时我也没有收到任何错误。我怀疑 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"
}
}
program.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();
}
任何帮助,将不胜感激。
解决方案
尝试将调试属性添加到 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 版本。
推荐阅读
- google-cloud-platform - 如何在 Apache Airflow 中加载到 BigQuery 之前转换数据?
- vba - 如何使用范围变量和同一变量的偏移量选择范围?
- python - 如何避免网格中的不连续性
- elasticsearch - 如何等到像弹性搜索这样的依赖服务可用于我在 docker-compose 中的服务
- python - Pandas:将值从 column.UID 复制到 column8 或 column9,具体取决于值的长度
- python-3.x - 如何从 tkinter 条目中制作评分按钮?
- pandas - Pandas 分组条形图
- typescript - 通过 API 获取和存储 MailChimp 兴趣的 Typescript 方法
- angular - RxJS Observable 发出数字;observer.next() 接受字符串;Typescript 如何处理这个问题?
- typescript - TS2322 TS2345 但 ___ 可以用不同的约束子类型实例化