Logger
1.前言
基础概念就as you know了,除了微软内置的logger外,.net core 还支持了多重第三方log工具,比如
本文只做内置logging和Nlog说明,前置是我之前学的,后者是我项目中使用的,废话不多说,开搞~
logger管理我了解的很少,只是正常使用的程度,优化的话,有一个LoggerMessage,没具体用过,这里就不谈了,
感兴趣的同学可以自己看看:高性能Logger
2.内置log
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
ps:.Net 6中CreateDefaultBuilder方法被隐藏了,所以我们在使用或者配置时 直接使用builder
var builder = WebApplication.CreateBuilder(args);
builder.Logging.ClearProviders();
builder.Logging.AddConsole();
builder.Services.AddRazorPages();
....
或者这些写也可以~
var builder = WebApplication.CreateBuilder(); builder.Host.ConfigureLogging(logging => { logging.ClearProviders(); logging.AddConsole(); });
添加到构造函数中使用。
public class AboutModel : PageModel { private readonly ILogger _logger; public AboutModel(ILogger<AboutModel> logger) { _logger = logger; } public string ? Message { get; set; } public void OnGet() { Message = $"About page visited at {DateTime.UtcNow.ToLongTimeString()}"; _logger.LogInformation(Message); } }
在创建ASP.NET Core Web应用程序时,会在appsettings.Development.json文件中自动添加以下配置
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } } }
这里需要知道一个概念log信息是分等级的(LogLevel),参数范围是0-6
Trace
= 0、Debug
= 1、Information
= 2、Warning
= 3、Error
= 4、Critical
= 5 和 None
= 6。
比如,当default配置为Information时,log将会记录Information及更高级别的信息,Information
= 2、Warning
= 3、Error
= 4、Critical
= 5 。
Microsolt.AspNetCore 代表系统信息。
{ "Logging": { "LogLevel": { // No provider, LogLevel applies to all the enabled providers. "Default": "Error", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Warning" }, "Debug": { // Debug provider. "LogLevel": { "Default": "Information" // Overrides preceding LogLevel:Default setting. } }, "Console": { "IncludeScopes": true, "LogLevel": { "Microsoft.AspNetCore.Mvc.Razor.Internal": "Warning", "Microsoft.AspNetCore.Mvc.Razor.Razor": "Debug", "Microsoft.AspNetCore.Mvc.Razor": "Error", "Default": "Information" } }, "EventSource": { "LogLevel": { "Microsoft": "Information" } }, "EventLog": { "LogLevel": { "Microsoft": "Information" } }, "AzureAppServicesFile": { "IncludeScopes": true, "LogLevel": { "Default": "Warning" } }, "AzureAppServicesBlob": { "IncludeScopes": true, "LogLevel": { "Microsoft": "Information" } }, "ApplicationInsights": { "LogLevel": { "Default": "Information" } } } }
以上为所有的默认的provider,可以显示的指定其显示规则,如果要禁止显示所有的log,指定为LogLevel.None即可。
3.Nlog
官网:https://github.com/nlog/nlog/wiki
1.添加Nuget包引用:NLog.Web.AspNetCore
2.添加nlog.confg配置文件,或者安装包nlog.confg
config长这样:
<?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" xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd" autoReload="true" throwExceptions="false" internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log"> <!-- optional, add some variables https://github.com/nlog/NLog/wiki/Configuration-file#variables --> <variable name="myvar" value="myvalue"/> <!-- See https://github.com/nlog/nlog/wiki/Configuration-file for information on customizing logging rules and outputs. --> <targets> <!-- add your targets here See https://github.com/nlog/NLog/wiki/Targets for possible targets. See https://github.com/nlog/NLog/wiki/Layout-Renderers for the possible layout renderers. --> <!-- Write events to a file with the date in the filename. <target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log" layout="${longdate} ${uppercase:${level}} ${message}" /> --> </targets> <rules> <!-- add your logging rules here --> <!-- Write all events with minimal level of Debug (So Debug, Info, Warn, Error and Fatal, but not Trace) to "f" <logger name="*" minlevel="Debug" writeTo="f" /> --> </rules> </nlog>
3.在CreateHostBuilder 中添加使用Nlog ( ConfigureLogging)
var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddControllersWithViews(); // NLog: Setup NLog for Dependency injection builder.Logging.ClearProviders(); builder.Logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace); builder.Host.UseNLog(); var app = builder.Build(); // Configure the HTTP request pipeline. if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Home/Error"); // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); app.Run();
4.在配置文件中appsettings.Development.json添加,与内置log格式一样
{ "Logging": { "LogLevel": { "Default": "Trace", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" } }, "AllowedHosts": "*" }
5.调用即可
using Microsoft.Extensions.Logging; public class HomeController : Controller { private readonly ILogger<HomeController> _logger; public HomeController(ILogger<HomeController> logger) { _logger = logger; _logger.LogDebug(1, "NLog injected into HomeController"); } public IActionResult Index() { _logger.LogInformation("Hello, this is the index!"); return View(); } }
实战配置文件
<?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" autoReload="true"> <variable name="logLevel" value="${level:uppercase=true}"/> <variable name="logDate" value="${date:format=yyyy-MM-dd HH\:mm\:ss,fffz}"/> <variable name="version" value="${assembly-version}"/> <variable name="logFolder" value="${basedir}/logs"/> <variable name="operator" value="${replace:searchFor=(\\.[\\w]+)+:replaceWith=:regex=true:inner=${logger}}"/> <variable name="logFile" value="${appdomain:format={1\}}-${operator}.log"/> <variable name="exceptionContent" value="${exception:format=tostring}"/> <targets> <!--<default-wrapper xsi:type="BufferingWrapper" bufferSize="100"/>--> <!-- log to file --> <target name="AllLog" xsi:type="File" header="|Level|DateTime|CorrelationId|Version|Thread|Class|Message|" layout="|${pad:padding=-5:inner=${logLevel}}|${logDate}|${mdlc:CorrelationId}|${version}|${threadid}|${logger:shortName=true}|${message} ${onexception:${exceptionContent}|" fileName="${logFolder}/${logFile}" maxArchiveFiles="20" archiveAboveSize="5242880" archiveFileName="${logFolder}/${logFile}.{#}" archiveNumbering="Rolling" keepFileOpen="false" encoding="utf-8" /> <target name="ELKLog" xsi:type="File" layout="${elkmessage}" fileName="/logs/elklogs/${logFile}" maxArchiveFiles="20" archiveAboveSize="5242880" archiveFileName="${logFolder}/elklogs/${logFile}.{#}" archiveNumbering="Rolling" keepFileOpen="false" encoding="utf-8" /> </targets> <rules> <logger name="*" minlevel="Debug" maxlevel="Fatal" writeTo="AllLog" /> <logger name="*" minlevel="Debug" maxlevel="Fatal" writeTo="ELKLog" /> </rules> </nlog>
Demo代码已同步到Github上:EFCore_Redis_logger.