登录C#库

kou*_*des 18 c# logging

所有,

我想知道在库中登录的最佳做法是什么.我正在创建一个供用户使用的C#库,在某些时候我想记录错误或警告.使用log4net并登录文件是一个好习惯吗?

谢谢,

中号

Ste*_*gli 22

我在自己的库中使用log4net,但如果我的库应该由其他人使用(即在我的组织之外),我就不会这样做.在这种情况下,我将使用一个接口进行日志记录,在单独的程序集中提供基于log4net的默认实现,并使用这种或那种方式允许库的用户注入自己的实现.

话虽如此:我真的很喜欢log4net,不会使用其他任何东西,但我认为迫使其他人必须使用您选择的日志框架是错误的.

编辑:

  • 我也不认为默认情况下将库记录到文件是一种很好的做法.您的库的用户应该能够决定日志消息的最终位置.
  • 我还提供了一个"无操作"实现,如果不需要任何日志记录就可以使用它.这可能应该是默认行为,不需要任何其他程序集或步骤来实现.


dpu*_*ton 11

使用log4net的好处在于您的库不必指定记录某些内容的位置.日志消息的目标(日志附加程序)由配置确定,该配置由应用程序指定(通常在配置文件中).

所以,是的,按照他们推荐的模式使用log4net(每个类一个独特的"记录器")并告知用户你的库使用log4net.库代码生成的任何日志消息都将根据使用者配置(文件,数据库,控制台,跟踪等)进行路由.

编辑:这是log4net的一个很好的简短入门,解释了基本概念.


Joe*_*Joe 7

我对在通用类库中引入对第三方库(例如 log4net)的依赖持谨慎态度:我更愿意将其留给调用者来决定如何进行日志记录。如果库的用户已经在使用不同的日志框架怎么办?

一些替代方案是:

  • 对于错误,抛出一个错误Exception或允许错误传播,并让调用者处理它并执行任何日志记录。

  • 对于警告(例如,您在库中处理的异常),您可以考虑引发调用者可以处理的事件(如果他想记录它)。例如,您可以引发一个Error事件,该事件采用包含错误详细信息的System.IO.ErrorEventArgs(或类似的自定义)。EventArgs

  • 如果您认为库需要更多工具,您可以在库中的战略点引发更多事件,调用者可以处理这些事件来进行日志记录。

  • 或者,您可以在类库(ILogging或类似库)中定义一个接口,调用者如果想要记录日志就必须实现该接口。让调用者将此接口的实例传递给类构造函数以启用日志记录。

  • 您可以执行类似于登录AWS SDK for .NET的操作,即支持多个日志记录框架,但使用反射加载第 3 方框架,以免创建依赖项。我个人不喜欢这样做,但这是一种有效的方法,特别是如果您的库足够大,足以证明详细的检测是合理的。


Hie*_*iep 6

这里的所有答案似乎都过时了。我会做一个新的:

我的图书馆要求一个可选的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)

  • 鉴于日志记录接口自 1.0 起就是 .NET 平台扩展的一部分,我认为这是最好的答案。所有关于第三方库依赖项的评论现在都无效。 (3认同)