登录C#库

时间:2010-05-04 10:10:42

标签: c# logging

全部,

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

谢谢,

M

10 个答案:

答案 0 :(得分:21)

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

说完这个:我真的很喜欢log4net,不会使用其他任何东西,但我认为迫使其他人必须使用您选择的日志框架是错误的。

编辑:

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

答案 1 :(得分:11)

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

所以是的,按照推荐的模式使用log4net(每个类别一个独特的“记录器”),并告知用户您的库使用log4net。库代码生成的任何日志消息都将根据consumers configuration(文件,数据库,控制台,跟踪等)进行路由。

编辑:log4net上的a good short primer解释了基本概念。

答案 2 :(得分:3)

练习vise一个好方法是引入一个Logging外观,所以你不关心你使用的记录器,你有一个一致的记录器通用接口。

例如,您可以尝试this或只是自己编写。

答案 3 :(得分:3)

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

My library要求一个可选的Microsoft.Extensions.Logging.ILogger对象来编写日志消息。如果没有ILogger对象,那么它将根本不会记录任何内容。

使用者应用程序可以使用NLog,Log4Net或SeriLog ..创建此ILogger对象,并且我的库可以在ASP.NET核心应用程序中使用,而无需登录框架。

使用NLog创建Microsoft ILogger的示例

private static readonly ILoggerFactory loggerFactory = LoggerFactory.Create(builder =>
{
    builder.AddNLog();
 });
private static readonly ILogger<Program> log = loggerFactory.CreateLogger<Program>();

使用log4net创建Microsoft ILogger的示例

ILoggerFactory loggerFactory = new LoggerFactory();
loggerFactory.AddLog4Net(); //load log4net.config by default
log = loggerFactory.CreateLogger("T");

答案 4 :(得分:1)

log4net只是第三方库,它不是最佳实践,在使用C#时必须将其用作日志库。我的建议总是将日志保存到某个地方(最常见的是文本文件)。但是,还有事件日志(需要一些额外的设置)。

我倾向于使用NLog,我发现它非常易于使用且设置简单。至于在您的类库中进行日志记录,它实际上只是您觉得哪种方法最适合您的应用程序。有些人会创建1个记录器并将其传递给类,其他人会为每个loggable类创建一个单独的记录器。我倾向于为每个类创建一个静态记录器,它工作正常。

答案 5 :(得分:1)

我认为,将日志包装在您自己的小型适配器中不会有什么坏处,例如,以后轻松从生产中剥离日志。我为此创建了一个small logging wrapper,其API如下所示:

Log.d("I'm a log message");
Log.w("I'm a warning with parmas", "param 1", 2, "..");
Log.e("I'm an error");
Log.e(new Exception("I'm an exception"));
AssertV2.IsTrue(1 + 1 == 3, "This assertion will fail");

有关更多示例,请参见https://github.com/cs-util-com/cscore#logging

您可以登录控制台,文件,Unity,并可以轻松添加更复杂的日志记录目标,例如Serilog

如果您有建议或其他反馈意见,请告诉我,我希望将其尽可能地小,但希望了解用例尚无法解决

答案 6 :(得分:1)

对于在通用类库中引入对第三方库(例如log4net)的依赖,我会保持警惕:我宁愿将它留给调用方来决定如何进行日志记录。如果该库的用户已经在使用其他日志记录框架怎么办?

一些替代方法是:

  • 对于错误,请抛出Exception或允许其传播,然后由调用方处理并进行任何日志记录。

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

  • 如果您觉得图书馆需要更多工具,可以在图书馆的战略要点引发更多事件,调用者可以处理这些事件以进行记录。

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

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

答案 7 :(得分:0)

这取决于你想做什么。

您是否希望拥有纯技术内容的日志记录机制,您可以通过不同的详细程度(支持活动)打开/关闭? 或者,您是否希望记录更多与业务相关的内容,以供您的库用户阅读?

您应首先回答这些问题,然后您可以决定记录什么,存储位置以及如何格式化...

无论如何,log4net是一个用于所有这些目的的良好,成熟和稳定的日志框架。并且记录滚动文件是常见的做法(但到目前为止不是唯一的选择......)。

此致 托马斯

答案 8 :(得分:0)

您的用户有哪些用于记录?
这是您需要回答的问题,以确定正确的框架 从我的pov开始,Log4net功能强大且相对容易。如果没有其他指定,你也可以用它来登录一个编写器。

答案 9 :(得分:0)

我使用SmartInspect

这个程序的好处是你可以在查看应用程序中过滤日志,这个功能在实践中非常有用。

为了记录,我不以任何方式与SmartInspect有关联。