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


    本文转自: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对象的输出方法,所以就能看到上面出现的效果。

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出作者名和原文连接,否则保留追究法律责任的权利。
     
    分类: Asp.Net Core
  • 相关阅读:
    easyui datagrid 跨页选择
    (转)flexpaper 参数
    FlexPaper做的类似百度文库的效果
    (转)ashx 使用Session
    (转)C#_WinForm接收命令行参数
    从数据库取出文件流显示图片
    (转)oracle触发器使用:after insert 与before insert的简单使用注意
    (转)sql server 事务与try catch
    (转)sqlite developer注册方法
    (转)IDataGridViewEditingControl 接口 作用
  • 原文地址:https://www.cnblogs.com/freeliver54/p/8072160.html
Copyright © 2020-2023  润新知