NLog在asp.net core中的应用

简介:

Asp.net core中,自带的Log是在当selfhost运行时,在控制台中输出,不便于查阅,如果用一个log架框,把日志持久化,便于查询.

NLog是一个免费的日志记录框架,专门为.net平台下的框架提供日志功能,本文主要说明asp.net core下怎么使用NLog。

首先用Nuget安装NLog.Extensions.Logging和NLog.Web.AspNetCore两个类库。

修改project.json,在publishOptions中添加”nlog.config节点”

"publishOptions": {

  "include": [

    "wwwroot",

    "**/*.cshtml",

    "appsettings.json",

    "web.config",

    "nlog.config"

  ]

}

在StartUp.cs中添加

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public  void  ConfigureServices(IServiceCollection services)
       {
           // Add framework services.
           services.AddMvc();
  
           //为NLog.web注入HttpContextAccessor
           services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
……
}
public  void  Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
            //添加NLog到.net core框架中
            loggerFactory.AddNLog();
            //添加NLog的中间件
            app.AddNLogWeb();
            //指定NLog的配置文件
            env.ConfigureNLog( "nlog.config" );
……
}


HomeController.cs中是自定义日志

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
static  Logger Logger = LogManager.GetCurrentClassLogger();
public  IActionResult Index()
{
     Logger.Info( "普通信息日志" );
     Logger.Debug( "调试日志" );
     Logger.Error( "错误日志" );
     Logger.Fatal( "异常日志" );
     Logger.Warn( "警告日志" );
     Logger.Trace( "跟踪日志" );
     Logger.Log(NLog.LogLevel.Warn,  "Log日志" );
     try
     {
         int  i = 0;
         var  a = 10 / i;
     }
     catch  (Exception exc)
     {
         //异常日志
         Logger.Fatal(exc, exc.Message);
     }
     return  View();
}


NLog.config,有两种日志,记录在C:\temp下,一种是全部日志,一种是自己通过NLog函数记录的日志。如果日志库异常,会产生在c:\temp\internal-nlog.txt下,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<? xml  version = "1.0"  encoding = "utf-8"  ?>
< nlog  xmlns = "http://www.nlog-project.org/schemas/NLog.xsd"
       xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
       autoReload = "true"
       internalLogLevel = "Warn"
       internalLogFile = "c:\temp\internal-nlog.txt" >
   <!--  ASP.NET Core 使用 -->
   < extensions >
     < add  assembly = "NLog.Web.AspNetCore" />
   </ extensions
   < targets >
     <!-- 全部日志文件 -->
     < target  xsi:type = "File"  name = "allfile"  fileName = "c:\temp\nlog-all-${shortdate}.log"
                 layout = "${longdate}|${event-properties:item=EventId.Id}|${logger}|${uppercase:${level}}|${message} ${exception}"  />
     <!-- 自定义记录的日志文件 -->
     < target  xsi:type = "File"  name = "ownFile-web"  fileName = "c:\temp\nlog-own-${shortdate}.log"
             layout = "${longdate}|${event-properties:item=EventId.Id}|${logger}|${uppercase:${level}}|  ${message} ${exception}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}"  />
     < target  xsi:type = "Null"  name = "blackhole"  />
   </ targets >
   < rules >
     <!--所括asp.net core下的全部日志-->
     < logger  name = "*"  minlevel = "Trace"  writeTo = "allfile"  />
     <!--仅自定义记录的日志文件-->
     < logger  name = "Microsoft.*"  minlevel = "Trace"  writeTo = "blackhole"  final = "true"  />
     < logger  name = "*"  minlevel = "Trace"  writeTo = "ownFile-web"  />
   </ rules >
</ nlog >


Layout中$后的数据就是要写日志的内容,关于这些数据可参考https://github.com/nlog/nlog/wiki/Layout-Renderers,可以根据自己的需要,选择要保存的日志数据,如下图是web中的日志数据:

 wKiom1iTJnagAKoAAAC_kDHd2Dw729.png-wh_50

如果想把日志保存到数据库中,可以把NLog.config修改如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<? xml  version = "1.0"  encoding = "utf-8"  ?>
< nlog  xmlns = "http://www.nlog-project.org/schemas/NLog.xsd"
       xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
       autoReload = "true"
       internalLogLevel = "Warn"
       internalLogFile = "c:\temp\internal-nlog.txt" >
  
   <!-- ASP.NET Core 使用  -->
   < extensions >
     < add  assembly = "NLog.Web.AspNetCore" />
   </ extensions >
  
   <!-- 注意配置连接字符串 -->
   < targets >
     < target  name = "database"  xsi:type = "Database"  connectionString = "server=.;database=nglogdb;uid=SQL用户名;pwd=SQL密码;" >
       < commandText >
         INSERT INTO [dbo].[NLog] (
         [MachineName],
         [SiteName],
         [Logged],
         [Level],
         [UserName],
         [Message],
         [Logger],
         [Properties],
         [Host],
         [Controller],
         [Action],
         [Url],
         [CallSite],
         [Exception]
         ) VALUES (
         @machineName,
         @siteName,
         @logged,
         @level,
         @userName,
         @message,
         @logger,
         @properties,
         @host,
         @controller,
         @action,
         @url,
         @callSite,
         @exception
         );
       </ commandText >
       < parameter  name = "@machineName"     layout = "${machinename}"  />
       < parameter  name = "@siteName"        layout = "${iis-site-name}"  />
       < parameter  name = "@logged"          layout = "${date}"  />
       < parameter  name = "@level"           layout = "${level}"  />
       < parameter  name = "@username"        layout = "${aspnet-user-identity}"  />
       < parameter  name = "@message"         layout = "${message}"  />
       < parameter  name = "@logger"          layout = "${logger}"  />
       < parameter  name = "@properties"      layout = "${all-event-properties:separator=|}"  />
       < parameter  name = "@host"            layout = "${aspnet-request-host}"  />
       < parameter  name = "@controller"      layout = "${aspnet-MVC-Controller}"  />
       < parameter  name = "@action"          layout = "${aspnet-MVC-Action}"  />
       < parameter  name = "@url"             layout = "${aspnet-request-url}"  />
       < parameter  name = "@callSite"        layout = "${callsite}"  />
       < parameter  name = "@exception"       layout = "${exception:tostring}"  />
     </ target >
   </ targets >
   < rules >
     < logger  name = "*"  minlevel = "Trace"  writeTo = "database" />
   </ rules >
</ nlog >


数据库数据如下:

wKiom1iTJxWSduw_AAXRGAbx4Ac008.png-wh_50




















本文转自桂素伟51CTO博客,原文链接: http://blog.51cto.com/axzxs/1894584,如需转载请自行联系原作者



相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
28天前
|
消息中间件 前端开发 小程序
一个基于.NET Core构建的简单、跨平台、模块化的商城系统
今天大姚给大家分享一个基于.NET Core构建的简单、跨平台、模块化、完全开源免费(MIT License)的商城系统:Module Shop。
|
28天前
|
算法 C# 数据库
【干货】一份10万字免费的C#/.NET/.NET Core面试宝典
C#/.NET/.NET Core相关技术常见面试题汇总,不仅仅为了面试而学习,更多的是查漏补缺、扩充知识面和大家共同学习进步。该知识库主要由自己平时学习实践总结、网上优秀文章资料收集(这一部分会标注来源)和社区小伙伴提供三部分组成。该份基础面试宝典完全免费,发布两年来收获了广大.NET小伙伴的好评,我会持续更新和改进,欢迎关注我的公众号【追逐时光者】第一时间获取最新更新的面试题内容。
|
28天前
|
数据可视化 网络协议 C#
C#/.NET/.NET Core优秀项目和框架2024年3月简报
公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),公众号推文中有项目和框架的介绍、功能特点、使用方式以及部分功能截图等(打不开或者打开GitHub很慢的同学可以优先查看公众号推文,文末一定会附带项目和框架源码地址)。注意:排名不分先后,都是十分优秀的开源项目和框架,每周定期更新分享(欢迎关注公众号:追逐时光者,第一时间获取每周精选分享资讯🔔)。
|
10天前
|
开发框架 缓存 前端开发
利用Visual Basic构建高效的ASP.NET Web应用
【4月更文挑战第27天】本文探讨使用Visual Basic与ASP.NET创建高效Web应用的策略,包括了解两者基础、项目规划、MVC架构、数据访问与缓存、代码优化、异步编程、安全性、测试及部署维护。通过这些步骤,开发者能构建出快速、可靠且安全的Web应用,适应不断进步的技术环境。
|
6天前
|
C# Windows
一款.NET开源、简洁易用的Windows桌面小说阅读应用
一款.NET开源、简洁易用的Windows桌面小说阅读应用
|
8天前
|
开发框架 物联网 测试技术
【专栏】.NET 开发:打造领先应用的基石
【4月更文挑战第29天】本文探讨了.NET开发框架为何成为构建领先应用的首选。高性能与稳定性是.NET的核心优势,它采用先进的技术和优化策略,如.NET Core的轻量级设计和JIT/AOT编译模式。跨平台兼容性让开发者能用相同代码库在不同操作系统上构建应用。现代化的开发体验,如C#语言的创新特性和Visual Studio的强大工具,提升了开发者生产力。丰富的生态系统和广泛支持,包括庞大的开发者社区和微软的持续投入,为.NET提供了坚实后盾。
|
8天前
|
机器学习/深度学习 人工智能 Cloud Native
【专栏】洞察.NET 技术的前沿应用
【4月更文挑战第29天】本文探讨了.NET技术的前沿应用,包括.NET Core的跨平台崛起、云原生及AI/机器学习领域的整合。.NET Core支持多平台运行,开源社区的参与促进了其快速发展和性能优化。Xamarin与.NET MAUI助力跨平台移动应用和统一界面开发,而云原生应用借助.NET Core与Azure云服务得以轻松构建和部署。此外,ML.NET和TensorFlow.NET为.NET开发者提供了机器学习和深度学习工具,推动智能应用和边缘计算的创新。.NET技术正持续演进,引领软件开发新趋势。
|
8天前
|
人工智能 物联网 开发者
【专栏】探究.NET 技术的创新应用
【4月更文挑战第29天】本文探讨了.NET技术的最新进展和创新应用,包括.NET 5及后续版本的统一平台、性能提升、跨平台支持、云集成优化和开源社区的贡献。在创新应用场景中,重点介绍了微服务架构、物联网、AI、游戏开发和移动应用。未来,.NET将持续优化性能,深化云原生应用,集成新兴技术,扩大社区生态,并促进相关教育和培训。开发者应把握.NET技术的潜力,积极参与其发展,创造更多创新软件产品。
|
8天前
|
安全 Linux API
【专栏】.NET 开发:打造卓越应用的秘诀
【4月更文挑战第29天】本文介绍了.NET技术的起源、核心特性和应用场景,揭示了其打造卓越应用的秘诀。自2002年推出,.NET历经发展,现支持跨平台,包括.NET Core和.NET 5。其核心特性包括:跨平台兼容性、面向对象编程、内置安全性和高效性能。丰富的类库、强大的开发工具、简洁的语言语法以及活跃的社区支持,使.NET成为构建高效、安全应用的理想选择。随着技术进步,.NET将持续赋能开发者创造更多可能性。
|
8天前
|
人工智能 安全 API
【专栏】理解 .NET 技术,打造优质应用
【4月更文挑战第29天】本文探讨了如何利用.NET技术构建高质量应用程序,介绍了.NET从2002年发展至今的历程,强调其跨平台能力、高效开发、丰富的类库和API、开源生态及安全性等优势。随着.NET 6的规划,平台将更加统一和跨平台,适应云计算、AI等新兴技术。.NET凭借其特性,成为开发者和企业创新的有力工具,未来将继续扮演重要角色。