当前位置: 首页 > 科技观察

如何在ASP.NETCore中使用NLog的高级特性

时间:2023-03-16 12:42:53 科技观察

本文转载请联系码农阅读公众号。NLog是一个开源的轻量级日志框架,提供了丰富的日志路由和管理功能。同时,NLog也非常容易配置和扩展。事实上,我在之前的文章中已经讨论过Nlog。在本文中,我将继续与您讨论NLog的更多高级功能。接下来我们看看如何通过.config和代码配置NLog,如何轮转日志,如何将Log连接到数据库,如何使用异步方式提高日志写入性能,我也会分享一些NLog的经验和技巧。要安装NLog,您可以通过NuGetPackageManager可视化界面或NuGetPackageManagerConsole控制台安装以下包文件。NLog.Web.AspNetCoreNLog.Extensions.LoggingNLog.Config安装NLog.Config后,一个名为NLog.config的文件将自动引用到您的项目。值得注意的是,NLog.Config对于NLog并不是唯一的,言外之意是可以使用config模式配置,也可以使用code-based模式配置。使用.config文件配置NLogNLog提供了两个配置选项。file-basedconfigurationmodecode-basedconfigurationmode回到刚才的问题,如何使用file-based模式,刚才介绍的NLog.Config的内容如下:下面的代码展示了如何在Controller下使用NLog记录日志。publicclassHomeController:Controller{Logger_logger=(Logger)LogManager.GetCurrentClassLogger(typeof(Logger));publicIActionResultIndex(){_logger.Info("Applicationstarted");returnView();}//Otheractionmethods}如果想通过编程方式找到当前的对于NLog的target,可以使用如下代码:varfileTarget=(FileTarget)LogManager.Configuration.FindTargetByName("logfile");使用代码配置NLog。也可以通过编码的形式配置NLog,调用NLog提供的API接口即可,下面的代码显示了如何配置Nlog。privatestaticvoidConfigureNLog(){varlogConfiguration=newLoggingConfiguration();vardbTarget=newDatabaseTarget();dbTarget.ConnectionString="DataSource=JOYDIP;initialcatalog=NLogDemo;UserId=sa;Password=sa1@3#.;";dbTarget.CommandText="INSERTINTODbLog(level,callsite,message,logdatetime)"+"Values(@level,@callsite,@message,@logdatetime)";dbTarget.Parameters.Add(newDatabaseParameterInfo("@level","${level}"));dbTarget.Parameters.Add(newDatabaseParameterInfo("@callSite","${callSite}"));dbTarget.Parameters.Add(newDatabaseParameterInfo("@message","${message}"));dbTarget.Parameters.Add(newDatabaseParameterInfo("@logdatetime","${date:s}"));varrule=newLoggingRule("*",LogLevel.Debug,dbTarget);logConfiguration.LoggingRules.Add(rule);LogManager.Configuration=logConfiguration;}配置rotation对于日志,可以让NLog自动实现日志轮转。什么是旋转?简单的说:可以让Nlog只保存近N个小时的日志,然后自动删除。除了超过N小时的日志,这个功能非常实用,否则需要到生产中频繁删除日志,下面代码展示了如何使用.config实现日志自动轮转记录日志到数据库创建数据库可以使用NLog将日志连接到数据库,下面的脚本是用于创建多条记录的日志表。创建表[dbo].[DbLog]([Id][int]IDENTITY(1,1)NOTNULL,[Level][varchar](max)NULL,[CallSite][varchar](max)NULL,[Message][varchar](max)NULL,[AdditionalInfo][varchar](max)NULL,[LogDateTime][datetime]NOTNULL,CONSTRAINT[PK_DbLogs]PRIMARYKEYCLUSTERED([Id]ASC)WITH(PAD_INDEX=OFF,STATISTICS_NORECOMPUTE=OFF,IGNORE_DUP_KEY=OFF,ALLOW_ROW_LOCKS=ON,ALLOW_PAGE_LOCKS=ON)ON[PRIMARY])ON[PRIMARY]TEXTIMAGE_ON[PRIMARY]GO数据库连接字符串及参数属性接下来NLog的target中如何指定数据库连接字符串,请注意如何connectionString和commandText已配置。最后使用参数化,使用参数化查询来防止注入攻击,具体代码如下。完整的NLog下面是完整的NLog文件供参考到。除了SQLServer,还可以使用NLog记录日志到MySQL、Oracle和SQLite数据库,使用AsyncWrapper提高性能,NLog支持多目标,比如:AsyncWrapper,BufferingWrapper,FallbackGroupandRetryingWrapper,异步target为了提高性能,采用了消息队列,在多线程中提取排队的消息,下面的代码展示了如何使用AsyncWrapper。可以实现AsyncWrapper来实现异步日志记录。详细配置如下:}.log"layout="${longdate}${uppercase:${level}}${message}"/>除了这个方法,还可以在所有目标上使用async=true,直接将它们标记为异步目标,如下配置所示:...Writeyourtargetshere...NLog最佳实践的这一部分列出了一些使用NLog的最佳实践。logger实例应该是静态的,这样可以避免程序中出现多次logger初始化带来的性能开销。充分利用NLog的格式(当你想要结构化日志时)支持,以避免你自己创建和拼接字符串。指定throwConfigExceptions="true"以确保在NLog配置错误时有详细的错误消息。示例如下:"true"throwConfigExceptions="true">记录日志后,可以调用LogManager.Shutdown()刷新数据,关闭所有内部Threads和定时器。NLog.LogManager.Shutdown();不要在AsyncWrapper之上使用async属性,否则性能会降低。请谨慎使用Trace级别,因为Trace会记录所有日志,请考虑改用Debug或Info。NLog轻量级且快速,并且可以使用异步包装器来提高性能。关于NLog还有太多话要说。NLog提供结构化日志,用于对大量日志进行快速过滤和分析。在以后的文章中,我将讨论NLog的更多高级功能。翻译链接:https://www.infoworld.com/article/3438540/using-advanced-nlog-features-in-aspnet-core.html