Ste*_*gli 22
我在自己的库中使用log4net,但如果我的库应该由其他人使用(即在我的组织之外),我就不会这样做.在这种情况下,我将使用一个接口进行日志记录,在单独的程序集中提供基于log4net的默认实现,并使用这种或那种方式允许库的用户注入自己的实现.
话虽如此:我真的很喜欢log4net,不会使用其他任何东西,但我认为迫使其他人必须使用您选择的日志框架是错误的.
编辑:
我对在通用类库中引入对第三方库(例如 log4net)的依赖持谨慎态度:我更愿意将其留给调用者来决定如何进行日志记录。如果库的用户已经在使用不同的日志框架怎么办?
一些替代方案是:
对于错误,抛出一个错误Exception或允许错误传播,并让调用者处理它并执行任何日志记录。
对于警告(例如,您在库中处理的异常),您可以考虑引发调用者可以处理的事件(如果他想记录它)。例如,您可以引发一个Error事件,该事件采用包含错误详细信息的System.IO.ErrorEventArgs(或类似的自定义)。EventArgs
如果您认为库需要更多工具,您可以在库中的战略点引发更多事件,调用者可以处理这些事件来进行日志记录。
或者,您可以在类库(ILogging或类似库)中定义一个接口,调用者如果想要记录日志就必须实现该接口。让调用者将此接口的实例传递给类构造函数以启用日志记录。
您可以执行类似于登录AWS SDK for .NET的操作,即支持多个日志记录框架,但使用反射加载第 3 方框架,以免创建依赖项。我个人不喜欢这样做,但这是一种有效的方法,特别是如果您的库足够大,足以证明详细的检测是合理的。
这里的所有答案似乎都过时了。我会做一个新的:
我的图书馆要求一个可选的Microsoft.Extensions.Logging.ILogger对象来写日志消息。如果没有ILogger对象,那么它根本不会记录任何内容。
消费者应用程序可以ILogger使用 NLog、Log4Net 或 SeriLog来创建这个对象。我的库可以在没有日志框架锁定的 ASP.NET 核心应用程序中使用。
使用其他 lggging 框架创建 Microsoft ILogger 的示例
private static readonly ILoggerFactory loggerFactory = LoggerFactory.Create(builder =>
{
builder.AddNLog(); //=>install NLog.Extensions.Logging nuget
//or builder.AddSerilog(); => install Serilog.Extensions.Logging nuget
//or builder.AddLog4Net() //=> Microsoft.Extensions.Logging.Log4Net.AspNetCore
});
private static readonly ILogger<Program> log = loggerFactory.CreateLogger<Program>();
//configure nlog/serilog/log4net normally then
log.LogInformation("Hello");
Run Code Online (Sandbox Code Playgroud)
在 Log4Net 的情况下,您还可以
ILoggerFactory loggerFactory = new LoggerFactory();
loggerFactory.AddLog4Net(); //load log4net.config by default
Run Code Online (Sandbox Code Playgroud)