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日志并进行多维度分析。
相关文章
|
8天前
|
数据可视化 网络协议 C#
C#/.NET/.NET Core优秀项目和框架2024年3月简报
公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),公众号推文中有项目和框架的介绍、功能特点、使用方式以及部分功能截图等(打不开或者打开GitHub很慢的同学可以优先查看公众号推文,文末一定会附带项目和框架源码地址)。注意:排名不分先后,都是十分优秀的开源项目和框架,每周定期更新分享(欢迎关注公众号:追逐时光者,第一时间获取每周精选分享资讯🔔)。
|
3月前
|
开发框架 前端开发 JavaScript
盘点72个ASP.NET Core源码Net爱好者不容错过
盘点72个ASP.NET Core源码Net爱好者不容错过
63 0
|
3月前
|
开发框架 .NET
ASP.NET Core NET7 增加session的方法
ASP.NET Core NET7 增加session的方法
37 0
|
3月前
|
开发框架 JavaScript .NET
ASP.NET Core的超级大BUG
ASP.NET Core的超级大BUG
39 0
|
1天前
|
开发框架 前端开发 JavaScript
采用C#.Net +JavaScript 开发的云LIS系统源码 二级医院应用案例有演示
技术架构:Asp.NET CORE 3.1 MVC + SQLserver + Redis等 开发语言:C# 6.0、JavaScript 前端框架:JQuery、EasyUI、Bootstrap 后端框架:MVC、SQLSugar等 数 据 库:SQLserver 2012
|
1月前
|
开发框架 人工智能 .NET
C#/.NET/.NET Core拾遗补漏合集(持续更新)
C#/.NET/.NET Core拾遗补漏合集(持续更新)
|
1月前
|
开发框架 中间件 .NET
C# .NET面试系列七:ASP.NET Core
## 第一部分:ASP.NET Core #### 1. 如何在 controller 中注入 service? 在.NET中,在ASP.NET Core应用程序中的Controller中注入服务通常使用<u>依赖注入(Dependency Injection)</u>来实现。以下是一些步骤,说明如何在Controller中注入服务: 1、创建服务 首先,确保你已经在应用程序中注册了服务。这通常在Startup.cs文件的ConfigureServices方法中完成。例如: ```c# services.AddScoped<IMyService, MyService>(); //
60 0
|
2月前
|
开发框架 前端开发 .NET
福利来袭,.NET Core开发5大案例,30w字PDF文档大放送!!!
为了便于大家查找,特将之前开发的.Net Core相关的五大案例整理成文,共计440页,32w字,免费提供给大家,文章底部有PDF下载链接。
32 1
福利来袭,.NET Core开发5大案例,30w字PDF文档大放送!!!
|
2月前
|
算法 BI API
C#/.NET/.NET Core优秀项目和框架2024年1月简报
C#/.NET/.NET Core优秀项目和框架2024年1月简报
|
3月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
38 0