循序渐进学.Net Core Web Api开发系列【10】:使用日志
系列目录
本系列涉及到的源码下载地址: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文件可能不会发布到目标目录,需要修改该文件的文件属性: