架构师_程序员

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 389|回复: 0

[.NET Core] ASP.NET Core ILogger日志使用教程

[复制链接]
跳转到指定楼层
楼主
发表于 2019-5-8 14:43:01
zu
ASP.NET Core 支持适用于各种内置和第三方日志记录提供程序的日志记录 API。记录日志是我们日常开发中必不可少的功能。

先看一下控制台的效果图,如下:



添加日志提供程序

日志记录提供程序会显示或存储日志。 例如,控制台提供程序在控制台上显示日志,Azure Application Insights 提供程序会将这些日志存储在 Azure Application Insights 中。 可通过添加多个提供程序将日志发送到多个目标。

编辑Program文件如下:

  1. public class Program
  2.     {
  3.         public static void Main(string[] args)
  4.         {
  5.             CreateWebHostBuilder(args).Build().Run();
  6.         }

  7.         public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
  8.             WebHost.CreateDefaultBuilder(args)
  9.                 .UseStartup<Startup>()
  10.             .ConfigureLogging((hostingContext, logging) =>
  11.                 {
  12.                     logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
  13.                     logging.AddConsole();
  14.                     //Debug.WriteLine 方法调用)来写入日志输出。
  15.                     //在 Linux 中,此提供程序将日志写入 / var / log / message。
  16.                     //logging.AddDebug();
  17.                     //在 Windows 中,它使用 ETW。 提供程序可跨平台使用,但尚无支持 Linux 或 macOS 的事件集合和显示工具。
  18.                     //logging.AddEventSourceLogger();
  19.                 });
  20.     }
复制代码
创建日志(构造函数方式注入)


以下控制器示例会创建所有级别的日志。
  1. public class HomeController : Controller
  2.     {
  3.         private readonly ILogger _logger;
  4.         public HomeController(ILogger<HomeController> logger)
  5.         {
  6.             _logger = logger;
  7.         }


  8.         public IActionResult Index()
  9.         {
  10.             _logger.LogInformation("by:www.itsvse.com");
  11.             _logger.LogWarning("访问home index页面!");
  12.             _logger.LogDebug("访问home index页面!");
  13.             _logger.LogCritical("访问home index页面!");
  14.             _logger.LogTrace("访问home index页面!");
  15.             _logger.LogError("访问home index页面!");
  16.             return View();
  17.         }
  18.     }
复制代码
日志等级
显示文字
前景颜色
背景颜色
Trace
trce
Gray
Black
Debug
dbug
Gray
Black
Information
info
DarkGreen
Black
Warning
warn
Yellow
Black
Error
fail
Red
Black
Critical
crit
White
Red

参考链接:https://docs.microsoft.com/zh-cn/dotnet/api/microsoft.extensions.logging.loglevel?view=aspnetcore-2.2

通过如下命令运行项目,即可通过控制台看到输出的日志了。

  1. dotnet run
复制代码
访问本地网址,即可看到输出结果。

控制日志级别

我们并不想看到控制台输出那么多无意义的info日志,只想看到自己记录的重要日志,怎么办呢?

1:通过配置文件控制日志级别,编辑appsettings.json文件,如下:

  1. {
  2.   "Logging": {
  3.     "Debug": {
  4.       "LogLevel": {
  5.         "Default": "Information"
  6.       }
  7.     },
  8.     "Console": {
  9.       "IncludeScopes": false,
  10.       "LogLevel": {
  11.         "Microsoft.AspNetCore.Mvc.Razor.Internal": "Warning",
  12.         "Microsoft.AspNetCore.Mvc.Razor.Razor": "Warning",
  13.         "Microsoft.AspNetCore.Mvc.Razor": "Warning",
  14.         "Default": "Warning"
  15.       }
  16.     },
  17.     "LogLevel": {
  18.       "Default": "Warning"
  19.     }
  20.   },
  21.   "AllowedHosts": "*",
  22.   "ConnectionStrings": {
  23.     "DefaultConnection": "Data Source=127.0.0.1;Initial Catalog=PanDb;user id=sa;password=123456;Max Pool Size=512;Min Pool Size=5"
  24.   }
  25. }
复制代码
此 JSON 将创建 6 条筛选规则:1 条用于调试提供程序, 4 条用于控制台提供程序, 1 条用于所有提供程序。 创建 ILogger 对象时,为每个提供程序选择一个规则。

2:通过代码控制(没有测试)

  1. WebHost.CreateDefaultBuilder(args)
  2.     .UseStartup<Startup>()
  3.     .ConfigureLogging(logging =>
  4.         logging.AddFilter("System", LogLevel.Debug)
  5.                .AddFilter<DebugLoggerProvider>("Microsoft", LogLevel.Trace));
复制代码
第二个 AddFilter 使用类型名称来指定调试提供程序。 第一个 AddFilter 应用于全部提供程序,因为它未指定提供程序类型。

默认最低级别

仅当配置或代码中的规则对给定提供程序和类别都不适用时,最低级别设置才会生效。 下面的示例演示如何设置最低级别:


  1. WebHost.CreateDefaultBuilder(args)
  2.     .UseStartup<Startup>()
  3.     .ConfigureLogging(logging => logging.SetMinimumLevel(LogLevel.Warning));
复制代码
如果没有明确设置最低级别,则默认值为 Information,它表示 Trace 和 Debug 日志将被忽略

参考链接:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/logging/?view=aspnetcore-2.2

使用Autofac通过属性注入ILogger日志

一般我们都是通过构造函数注入日志服务,如何通过属性注入呢?还有如何把ILogger托管给Autofac呢?

在Startup编辑方法ConfigureServices,如下:


  1. public IServiceProvider ConfigureServices(IServiceCollection services)
  2. {
  3.         services.Configure<CookiePolicyOptions>(options =>
  4.         {
  5.                 // This lambda determines whether user consent for non-essential cookies is needed for a given request.
  6.                 options.CheckConsentNeeded = context => true;
  7.                 options.MinimumSameSitePolicy = SameSiteMode.None;
  8.         });
  9.         services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1).AddControllersAsServices(); ;
  10.         //添加数据库上下文和配置数据库连接字符串
  11.         PanDb.ConnectionString = Configuration.GetConnectionString("DefaultConnection");
  12.         services.AddDbContext<PanDb>();
  13.         var builder = new ContainerBuilder();
  14.         builder.Populate(services);//Autofac.Extensions.DependencyInjection
  15.         builder.RegisterInstance(new LoggerFactory())
  16.                 .As<ILoggerFactory>();

  17.         builder.RegisterGeneric(typeof(Logger<>))
  18.                    .As(typeof(ILogger<>))
  19.                    .SingleInstance();
  20.         //注册服务
  21.         builder.Register(c => new AOPTest());
  22.         builder.RegisterType<TestService1>().As<ITestService1>().PropertiesAutowired().EnableInterfaceInterceptors();
  23.         builder.RegisterType<TestService2>().As<ITestService2>().PropertiesAutowired();
  24.         builder.RegisterType<TestService3>().As<ITestService3>().PropertiesAutowired();

  25.         //注册所有控制器
  26.         var controllersTypesInAssembly = typeof(Startup).Assembly.GetExportedTypes()
  27.         .Where(type => typeof(ControllerBase).IsAssignableFrom(type)).ToArray();
  28.         builder.RegisterTypes(controllersTypesInAssembly).PropertiesAutowired();
  29.         builder.RegisterType<AOPTest>().PropertiesAutowired();
  30.         var container = builder.Build();
  31.         var loggerFactory = container.Resolve<ILoggerFactory>();
  32.         loggerFactory.AddConsole();
  33.         return new AutofacServiceProvider(container);
  34. }
复制代码
重要的以下四句话:

  1. builder.RegisterInstance(new LoggerFactory())
  2.                 .As<ILoggerFactory>();

  3.             builder.RegisterGeneric(typeof(Logger<>))
  4.                    .As(typeof(ILogger<>))
  5.                    .SingleInstance();
复制代码
  1. var loggerFactory = container.Resolve<ILoggerFactory>();
  2.             loggerFactory.AddConsole();
复制代码
一定要加loggerFactory.AddConsole();这行代码,否则控制台将不会输出任何内容,并且给autofac托管,配置文件将失效。

控制器代码:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.Linq;
  5. using System.Threading.Tasks;
  6. using Microsoft.AspNetCore.Mvc;
  7. using BaiDuPan.WebUI.Models;
  8. using Microsoft.Extensions.Logging;

  9. namespace BaiDuPan.WebUI.Controllers
  10. {
  11.     public class HomeController : Controller
  12.     {
  13.         public ILogger<HomeController> test { get; set; }


  14.         public IActionResult Index()
  15.         {
  16.             test.LogWarning("访问home index页面!");
  17.             return View();
  18.         }
  19.     }
  20. }
复制代码
访问网址,dotnet run启动项目,控制台输出如下:



如何把日志ILogger通过属性注入到别的类里面。

  1. //在ConfigureServices配置
  2. builder.RegisterType<ItsvseTest>().PropertiesAutowired();

  3. //ItsvseTest类属性注入
  4. public class ItsvseTest
  5. {

  6.         public ILogger<ItsvseTest> _logger { get; set; }

  7.         public void send()
  8.         {
  9.                 _logger.LogWarning("test");
  10.         }
  11. }
复制代码
(完)




上一篇:ASP.NET Core使用Autofac两种方式实现IOC注入
下一篇:ASP.NET Core使用Autofac实现AOP拦截
帖子永久地址: 

架构师_程序员 - 论坛版权1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关
2、本站所有主题由该帖子作者发表,该帖子作者与架构师_程序员享有帖子相关版权
3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和架构师_程序员的同意
4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
7、架构师_程序员管理员和版主有权不事先通知发贴者而删除本文

码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。

Mail To:help@itsvse.com

QQ|Archiver|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2019-7-18 09:31

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表