• 循序渐进学.Net Core Web Api开发系列【10】:使用日志


    原文:循序渐进学.Net Core Web Api开发系列【10】:使用日志

    系列目录

    循序渐进学.Net Core Web Api开发系列目录

     本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi

    一、本篇概述

    本篇介绍日志的使用,包括系统默认的控制台日志和第三方NLog日志管理。

    二、使用系统控制台日志

    1、使用内置日志

    复制代码
        [Produces("application/json")]
        [Route("api/Article")]
        public class ArticleController : Controller
        {      private readonly ILogger _logger;
            public ArticleController(SalesContext context, ILogger<ArticleController> logger)
            {          
                _logger = logger;
            }       
    
        [HttpGet(</span><span style="color: #800000;">"</span><span style="color: #800000;">logger</span><span style="color: #800000;">"</span><span style="color: #000000;">)]
        </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span> TestLogger(<span style="color: #000000;">)
        {</span><span style="color: #000000;">
            _logger.LogCritical(</span><span style="color: #800000;">"</span><span style="color: #800000;">LogCritical</span><span style="color: #800000;">"</span><span style="color: #000000;">);
            _logger.LogError(</span><span style="color: #800000;">"</span><span style="color: #800000;">LogError</span><span style="color: #800000;">"</span><span style="color: #000000;">);          
            _logger.LogWarning(</span><span style="color: #800000;">"</span><span style="color: #800000;">LogWarning</span><span style="color: #800000;">"</span><span style="color: #000000;">);
            _logger.LogInformation(</span><span style="color: #800000;">"</span><span style="color: #800000;">LogInformation</span><span style="color: #800000;">"</span><span style="color: #000000;">);
            _logger.LogDebug(</span><span style="color: #800000;">"</span><span style="color: #800000;">LogDebug</span><span style="color: #800000;">"</span><span style="color: #000000;">);
    
            </span><span style="color: #0000ff;">return</span><span style="color: #000000;">;
        }
    }</span></pre>
    
    复制代码

    默认只能看到前三条记录:

    主要原因是日志的最低级别默认为Warring,如果要显示其他级别日志,需要修改application.json文件。 

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
      "Logging": {
        "IncludeScopes": false,
        "Debug": {
          "LogLevel": {
            "Default": "Error"
          }
        },
        "Console": {
          "LogLevel": {
            "Default": "Information"
          }
        }
      }
    }

    日志级别优先级如下顺序:

    Critical > Error > Warning > Information > Debug

    调整日志级别为Information 或Debug以后会显示太多无关的日志信息,可以配置默认级别为Warring,而自己项目命名空间的日志级别为Debug。

    1
    2
    3
    4
    5
    6
    "Console": {
          "LogLevel": {
            "Default": "Warning",
            "SaleService.Controllers": "DEBUG"
          }
        }

    2、几点说明

    1)目前日志已经可以正常工作了,把项目发布到Linux环境下,通过配置Supervisor可以把控制台的内容输出到文件系统,建议在调试环境下采用Debug日志级别,而在生成环境采用Error日志级别。配置Supervisor的内容可以参考:循序渐进学.Net Core Web Api开发系列【7】:项目发布

     2)如果稍微了解依赖注入(DI)的知识,就可以理解我们在Controoler中使用ILogger是采用标准的构造函数注入的方式,但是问题是用户并没有注册该服务,其实是系统在CreateDefaultBuilder时帮我们注册了日志服务。可以看几段源码的片段:

    CreateDefaultBuilder:
    复制代码
    using System;
    using System.IO;
    using System.Reflection;
    using Microsoft.AspNetCore.Builder;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.AspNetCore.Http;
    using Microsoft.AspNetCore.Routing;
    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.Logging;
    

    namespace Microsoft.AspNetCore
    {

    public static class WebHost
    {

    public static IWebHostBuilder CreateDefaultBuilder(string[] args)
    {
    return WebHostBuilderIISExtensions.UseIISIntegration(HostingAbstractionsWebHostBuilderExtensions.UseContentRoot(WebHostBuilderKestrelExtensions.UseKestrel(new WebHostBuilder()), Directory.GetCurrentDirectory()).ConfigureAppConfiguration(delegate(WebHostBuilderContext hostingContext, IConfigurationBuilder config)
    {
    IHostingEnvironment hostingEnvironment
    = hostingContext.HostingEnvironment;
    JsonConfigurationExtensions.AddJsonFile(JsonConfigurationExtensions.AddJsonFile(config,
    "appsettings.json", true, true), string.Format("appsettings.{0}.json", hostingEnvironment.EnvironmentName), true, true);
    if (HostingEnvironmentExtensions.IsDevelopment(hostingEnvironment))
    {
    Assembly assembly
    = Assembly.Load(new AssemblyName(hostingEnvironment.ApplicationName));
    if (assembly != null)
    {
    UserSecretsConfigurationExtensions.AddUserSecrets(config, assembly,
    true);
    }
    }
    EnvironmentVariablesExtensions.AddEnvironmentVariables(config);
    if (args != null)
    {
    CommandLineConfigurationExtensions.AddCommandLine(config, args);
    }
    }).ConfigureLogging(
    delegate(WebHostBuilderContext hostingContext, ILoggingBuilder logging)
    {
    LoggingBuilderExtensions.AddConfiguration(logging, hostingContext.Configuration.GetSection(
    "Logging"));
    logging.AddConsole();
    logging.AddDebug();

    })).UseDefaultServiceProvider(
    delegate(WebHostBuilderContext context, ServiceProviderOptions options)
    {
    options.ValidateScopes
    = HostingEnvironmentExtensions.IsDevelopment(context.HostingEnvironment);
    });
    }
    }
    }

    复制代码
    AddConsole:
    复制代码
    using System;
    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.Logging.Console;
    

    namespace Microsoft.Extensions.Logging
    {

    public static class ConsoleLoggerExtensions
    {

    public static ILoggingBuilder AddConsole(this ILoggingBuilder builder)
    {
    builder.Services.AddSingleton
    <ILoggerProvider, ConsoleLoggerProvider>();
    return builder;
    }

    }
    }

    复制代码

    三、使用NLog

    1、通过NuGet获取包:NLog.Web.AspNetCore

    2、修改Startup类的Configure方法:

    复制代码
     public class Startup
        {
            public Startup(IConfiguration configuration)
            {
                Configuration = configuration;
            }
            public IConfiguration Configuration { get; }       

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { loggerFactory.AddNLog(); loggerFactory.ConfigureNLog("nlog.config"); //如果采用默认配置文件nlog.config,该语句可以省略 } }
    复制代码

    nlog.config配置文件内容如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?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">
      <targets>
        <target xsi:type="File" name="logfile" fileName="${basedir}/logs/${shortdate}_all.log" keepFileOpen="false" layout="${longdate}|${callsite:fileName=True}|${uppercase:${level}}|${message} ${exception}" />
        <target xsi:type="File" name="debugfile" fileName="${basedir}/logs/${shortdate}_debug.log" keepFileOpen="false" layout="${longdate}|${callsite:fileName=True}|${uppercase:${level}}|${message} ${exception}" />
        <target xsi:type="File" name="errfile" fileName="${basedir}/logs/${shortdate}_error.log" keepFileOpen="false" layout="${longdate}|${callsite:fileName=True}|${uppercase:${level}}|${message} ${exception}" />
      </targets>
      <rules>
        <logger name="*" level="Debug" writeTo="debugfile" />
        <logger name="*" level="Error" writeTo="errfile" />   
        <logger name="*" minlevel="Trace" writeTo="logfile" />
      </rules>
    </nlog>

    项目发布时修改配置文件,只保留errfile即可。

    以上就是全部代码,Controller中的代码无需修改。

    3、两个注意点

    1)目前我们已经采用NLog来进行日志的记录,此时系统默认的日志仍然是正常工作的,项目发布时建议把系统默认的日志级别改成Error,nlog的输出日志只保留errfile,以免造成服务器磁盘空间浪费。

    2)项目发布时nlog.config文件可能不会发布到目标目录,需要修改该文件的文件属性:

  • 相关阅读:
    WPF Prefix 'attach' does not map to a namespace.
    C# 用ManulResetEvent 控制Thread的 Suspend、Resume
    C# 监控Windows睡眠与恢复
    c# DataTable to Object Mapping
    C# DispatcherTimer Start之后立即执行
    Visual studio 编译时copy文件、文件夹
    c# 无法加载xxx.dll 找不到指定的模块(如何指定文件夹)
    EntityFramework 找不到方法:“Void System.Data.Entity.DbModelBuilder.RegisterEntityType
    wpf 全局异常捕获处理
    pandas入门
  • 原文地址:https://www.cnblogs.com/owenzh/p/11207069.html
Copyright © 2020-2023  润新知