在 .Net core 2.0 中不支持 log4net AdoNetAppender?

7
我正在在 asp.net core 2.0 中实现 log4net 的 AdoNetAppender,但是我猜测它不支持。我已经使用 log4.net 配置在 core 2.0 中实现了 RollingFileAppender,并且它成功地工作了。所以,如果 log4net AdoNetAppender 在 core 2.0 中不被支持,那么是否有其他方法可以将日志插入到 sql 数据库中?谢谢。
2个回答

9

2
使用第三方工具 - Pr.Dumbledor
6
@Pr.Dumbledor 这是一个解决Vishal面临问题的答案。我也给出了其他选项。 - prashant
看起来不错,但似乎缺少一些功能。比如我想根据某个属性过滤掉一些消息,但无法成功。请查看 https://github.com/microknights/Log4NetAdoNetAppender/issues/13 - Kamran Shahid
针对@KamranShahid的评论进行跟进。Log4NetAdoNetAppender适用于.net core/standard,运行良好。但是,如果您需要在appender中对自定义字段进行过滤,则需要编写自定义过滤器。这适用于log4net的一般情况,并且可以在提供的链接中找到相关方法。 - Frank Nielsen

0

我曾经遇到过同样的问题,我是这样解决的:

在 ASP.NET Core 项目中添加 log4net.config.xml 文件并配置 appender。在该文件中,对于 AdoNetAppender,您可以指定 connectionStringconnectionStringName,但这没有意义,因为连接将为 null

因此,应将连接字符串添加到 appsettings.json 中。

"ConnectionStrings": {
   "Log": "Data Source=localhost\\SQLEXPRESS;Initial Catalog=Log.Database;User ID=sa;Password=;MultipleActiveResultSets=True"
}

然后进行配置

ILoggerRepository logRepository = log4net.LogManager.GetRepository(Assembly.GetExecutingAssembly());
XmlConfigurator.Configure(logRepository, new FileInfo("log4net.config"));\

手动分配连接字符串

ILog _databaseLogger = log4net.LogManager.GetLogger("DBLogger");
var repository = _databaseLogger?.Logger.Repository;
if (repository != null) 
{
    _adoAppender = repository.GetAppenders()
        .FirstOrDefault(a => a is AdoNetAppender) as AdoNetAppender;

    if (_adoAppender != null && string.IsNullOrEmpty(_adoAppender.ConnectionStringName)) 
    {
        _adoAppender.ConnectionString = "some connection string from appsettings.json";
        _adoAppender.ActivateOptions();
    }
}

ActivateOptions() 调用重新初始化 appender。


log4net.Appender.AdoNetAppender 目前还不支持 .NET Core 2.0。 - prashant
@prashant 你在说什么?我正在使用这段代码,它针对的是 .netcoreapp2.0 项目,但是 log4net 的包当然是针对 461 的。通过这种解决方法,一切都正常工作。 - Roman Marusyk
@RomanMarusyk 谢谢,很好用。如果您编辑您的答案,@prashant 就会知道您的意思了。我不得不添加 AdoNetAppender 类并从我的应用程序中调用它,您的代码完美地运行。 - khaled Dehia
您可以通过在 XML 文件中添加 <connectionString value="your connection string so something like Data Source=..."/> 来执行与我提出的相同操作。 connectionStringName 是无用的。 - Ant

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