全部,
我想知道有关在库中登录的最佳做法是什么。 我正在创建一个供用户使用的C#库,在某些时候我想记录错误或警告。使用log4net并登录文件是一个好习惯吗?
谢谢,
M
答案 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)