您的位置:首页 > 编程语言 > ASP

[转]使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(三)-- Logger

2017-12-20 09:30 731 查看
本文转自:https://www.cnblogs.com/niklai/p/5662094.html


本篇是在上一篇的基础上添加日志功能,并记录NLog在Asp.Net Core里的使用方法。


第一部分:默认Logger支持

一、project.json添加日志包引用,并在cmd窗口使用 dotnet restore 命令还原包文件。

1 {
2   "version": "1.0.0-*",
3   "buildOptions": {
4     "debugType": "portable",
5     "emitEntryPoint": true
6   },
7   "dependencies": {
8     "Microsoft.NETCore.App": {
9       "type": "platform",
10       "version": "1.0.0"
11     },
12     "Microsoft.AspNetCore.Server.Kestrel": "1.0.0",
13     "Microsoft.AspNetCore.Mvc": "1.0.0",
14     "Microsoft.Extensions.Logging": "1.0.0",
15     "Microsoft.Extensions.Logging.Console": "1.0.0",
16     "Microsoft.Extensions.Logging.Debug": "1.0.0",
17     "Microsoft.Extensions.Logging.Filter": "1.0.0"
18   },
19   "frameworks": {
20     "netcoreapp1.0": {
21       "imports": "dnxcore50"
22     }
23   }
24 }


二、修改Startup.cs文件,添加命令行窗口和调试窗口的日志记录功能。

1 using Microsoft.AspNetCore.Builder;
2 using Microsoft.Extensions.DependencyInjection;
3 using Microsoft.Extensions.Logging;
4
5 namespace WebApiFrame
6 {
7     public class Startup
8     {
9         public void ConfigureServices(IServiceCollection services)
10         {
11             // 注入MVC框架
12             services.AddMvc();
13         }
14
15         public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
16         {
17             // 添加日志支持
18             loggerFactory.AddConsole();
19             loggerFactory.AddDebug();
20
21             // 添加MVC中间件
22             app.UseMvc();
23         }
24     }
25 }


三、分别使用VS Code的调试功能和命令行的 dotnet run 命令启动程序,浏览器访问 http://localhost:5000/api/users/1 地址后,可以查看到窗口日志打印信息。



第二部分:Logger日志级别

日志级别从低到高一共六级,默认情况下,控制台上输出的日志会采取下面的格式:



我们在DemoController.cs控制器里演示如何设置和输出对应级别的日志。

一、修改Startup.cs内容,设置日志级别。

1 using Microsoft.AspNetCore.Builder;
2 using Microsoft.Extensions.DependencyInjection;
3 using Microsoft.Extensions.Logging;
4
5 namespace WebApiFrame
6 {
7     public class Startup
8     {
9         public void ConfigureServices(IServiceCollection services)
10         {
11             // 注入MVC框架
12             services.AddMvc();
13         }
14
15         public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
16         {
17             // 添加日志支持
18
19             // 设置日志最小级别Warning
20             loggerFactory.AddConsole(LogLevel.Warning);
21
22             //loggerFactory.AddDebug();
23
24             // 添加MVC中间件
25             app.UseMvc();
26         }
27     }
28 }


二、修改UsersController.cs文件内容,添加日志输出。

1 using System;
2 using Microsoft.AspNetCore.Mvc;
3 using Microsoft.Extensions.Logging;
4 using WebApiFrame.Models;
5
6 namespace WebApiFrame.Controllers
7 {
8
9     [Route("api/[controller]")]
10     public class UsersController : Controller
11     {
12         private ILogger<UsersController> _logger;
13
14         public UsersController(ILogger<UsersController> logger){
15             _logger = logger;
16         }
17
18         [HttpGet("{id}")]
19         public IActionResult Get(int id)
20         {
21             // 演示日志输出
22             _logger.LogInformation("This is Information Log!");
23             _logger.LogWarning("This is Warning Log!");
24             _logger.LogError("This is Error Log!");
25
26             var user = new User() { Id = id, Name = "Name:" + id, Sex = "Male" };
27             return new ObjectResult(user);
28         }
29
30         [HttpPost]
31         public IActionResult Post([FromBody] User user){
32             if(user == null){
33                 return BadRequest();
34             }
35
36             // TODO:新增操作
37             user.Id = new Random().Next(1, 10);
38             return CreatedAtAction("Get", new { id = user.Id }, user);
39         }
40
41         [HttpPut("{id}")]
42         public IActionResult Put(int id, [FromBody] User user){
43             if(user == null){
44                 return BadRequest();
45             }
46
47             // TODO: 更新操作
48             return new NoContentResult();
49         }
50
51         [HttpDelete("{id}")]
52         public void Delete(int id){
53             // TODO: 删除操作
54
55         }
56     }
57 }


三、cmd窗口执行 dotnet run 命令,浏览器访问 http://localhost:5000/api/users/1 地址,查看cmd窗口日志输出。



或者,使用Filter设置日志级别,重新执行访问并查看日志输出。

1         public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
2         {
3             // 添加日志支持
4
5             // 设置日志最小输出级别为Error
6             loggerFactory.WithFilter(new FilterLoggerSettings()
7             {
8                 // 设置以命名空间开头的日志的最小输出级别
9                 { "Microsoft", LogLevel.Warning },
10                 { "WebApiFrame", LogLevel.Error }
11             }).AddConsole();
12
13             //loggerFactory.AddDebug();
14
15             // 添加MVC中间件
16             app.UseMvc();
17         }




第三部分:NLog

NLog是一个简单灵活的.Net日志记录类库。相比Log4Net来说,配置要简单许多。

一、project.json添加NLog包引用,并使用 dotnet restore 命令还原包文件。

1 {
2   "version": "1.0.0-*",
3   "buildOptions": {
4     "debugType": "portable",
5     "emitEntryPoint": true
6   },
7   "dependencies": {
8     "Microsoft.NETCore.App": {
9       "type": "platform",
10       "version": "1.0.0"
11     },
12     "Microsoft.AspNetCore.Server.Kestrel": "1.0.0",
13     "Microsoft.AspNetCore.Mvc": "1.0.0",
14     "Microsoft.Extensions.Logging": "1.0.0",
15     "Microsoft.Extensions.Logging.Console": "1.0.0",
16     "Microsoft.Extensions.Logging.Debug": "1.0.0",
17     "Microsoft.Extensions.Logging.Filter": "1.0.0",
18     "NLog.Extensions.Logging": "1.0.0-rtm-alpha2"
19   },
20   "frameworks": {
21     "netcoreapp1.0": {
22       "imports": "dnxcore50"
23     }
24   }
25 }


二、添加NLog配置文件nlog.config。

1 <?xml version="1.0" encoding="utf-8" ?>
2 <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
3       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4       autoReload="true"
5       internalLogLevel="Warn"
6       internalLogFile="internal-nlog.txt">
7
8   <!-- define various log targets -->
9   <targets>
10     <!-- write logs to file -->
11     <target xsi:type="File" name="allfile" fileName="nlog-all-${shortdate}.log"
12                  layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" />
13
14
15     <target xsi:type="File" name="ownFile-web" fileName="nlog-own-${shortdate}.log"
16              layout="${longdate}|${logger}|${uppercase:${level}}|  ${message} ${exception}" />
17
18     <target xsi:type="Null" name="blackhole" />
19   </targets>
20
21   <rules>
22     <!--All logs, including from Microsoft-->
23     <logger name="*" minlevel="Trace" writeTo="allfile" />
24
25     <!--Skip Microsoft logs and so log only own logs-->
26     <logger name="Microsoft.*" minlevel="Trace" writeTo="blackhole" final="true" />
27     <logger name="*" minlevel="Trace" writeTo="ownFile-web" />
28   </rules>
29 </nlog>


三、修改Startup.cs文件内容,添加NLog支持。

1 using Microsoft.AspNetCore.Builder;
2 using Microsoft.Extensions.DependencyInjection;
3 using Microsoft.Extensions.Logging;
4 using NLog.Extensions.Logging;
5
6 namespace WebApiFrame
7 {
8     public class Startup
9     {
10         public void ConfigureServices(IServiceCollection services)
11         {
12             // 注入MVC框架
13             services.AddMvc();
14         }
15
16         public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
17         {
18             // 添加日志支持
19             //loggerFactory.AddConsole();
20             //loggerFactory.AddDebug();
21
22             // 添加NLog日志支持
23             loggerFactory.AddNLog();
24
25             // 添加MVC中间件
26             app.UseMvc();
27         }
28     }
29 }


四、重新执行访问并查看日志输出。

生成的日志文件和内容





第四部分、其他相关内容

最后,同时放开三种日志输出方式,不修改控制器里的任何代码,可以发现将同时以三种方式记录相同的日志内容。

1         public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
2         {
3             // 添加日志支持
4             loggerFactory.AddConsole();
5             loggerFactory.AddDebug();
6
7             // 添加NLog日志支持
8             loggerFactory.AddNLog();
9
10             // 添加MVC中间件
11             app.UseMvc();
12         }



在.Net Core框架里,日志功能主要由 ILoggerFactory, ILoggerProvider, ILogger 这三个接口体现:

ILoggerFactory:工厂接口。只提供注册LoggerProvider的方法和创建单实例Logger对象的方法。

ILoggerProvider:提供真正具有日志输出功能的Logger对象的接口。每一种日志输出方式对应一个不同的LoggerProvider类。

ILogger:Logger接口。Logger实例内部会维护一个ILogger接口的集合,集合的每一项都是由对应的LoggerProvider类注册生成的Logger对象而来。当调用Logger的日志输出方法时,实际是循环调用内部集合的每一个Logger对象的输出方法,所以就能看到上面出现的效果。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐