如何定制.NET6.0的日志記錄

在本章中,也就是整個系列的第一部分將介紹如何定制日志記錄(系列內容查閱《玩轉ASP.NET 6.0框架-序言》)。默認日志記錄僅寫入控制臺或調試窗口,這在大多數情況下都很好,但有時需要寫入到文件或數據庫,或者,您可能希望擴展日志記錄的其他信息。在這些情況下,您需要知道如何更改默認日志記錄。

在本章,我們將介紹以下主題:

  • 配置日志記錄

  • 創建自定義日志記錄

  • 使用第三方日志框架

以上主題涉及ASP.NET Core框架的Host層。
85bcfa0927dd0efb633dcfbe300d77e1.png

技術要求

為了演示,我們創建一個ASP.NET Core MVC應用程序。請打開控制臺、shellBash終端,然后切換到工作目錄,然后使用以下命令創建新的應用程序:

dotnet new mvc -n LoggingSample -o LoggingSample

Visual Studio中雙擊打開該項目,或者在控制臺中鍵入以下命令用Visual Studio Code打開該項目:

cd LoggingSample code .

配置日志記錄

ASP.NET Core的早期版本中(即2.0版之前的版本),日志記錄是在Startup.cs配置的。之后Startup.cs文件慢慢簡化,許多配置被移動到Program.csWebHostBuilder,日志記錄也是在這個時候被移動到WebHostBuilder

ASP.NET Core 3.1及更高版本的程序,Program.cs文件變得更加通用,IHostBuilder將最先創建,它是引導應用啟動的關鍵(我們將在后面詳解IHostBuilder),通過IHostBuilder,我們可以創建IWebHostBuilder用以配置ASP.NET Core

public class Program {     public static void Main(string[] args){         CreateHostBuilder(args).Build().Run();     }     public static IHostBuilder CreateHostBuilder(string[] args) =>Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>();}); 
}

ASP.NET Core 6.0中,Microsoft引入了簡化配置的迷你API(minimal API)方法。這種方法不使用Startup文件,而是將所有配置添加到Program.cs文件,如下代碼段:

var builder = WebApplication.CreateBuilder(args); //添加服務到容器.
builder.Services.AddControllersWithViews(); 
var app = builder.Build(); 
…

ASP.NET Core,您可以覆蓋和自定義幾乎所有內容,包括日志記錄。IWebHostBuilder有很多擴展方法,允許我們覆蓋不同功能的默認行為。要覆蓋日志記錄的默認設置,我們需要使用ConfigureLogging方法。

以下代碼片段顯示的日志記錄與上面的ConfigureWebHostDefaults()方法中配置的日志記錄幾乎完全相同:

Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder =>{         webBuilder.ConfigureLogging((hostingContext, logging) => {logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));                 logging.AddConsole();                 logging.AddDebug();             }).UseStartup<Startup>();

使用minimal API方法,我們不再需要ConfigureLogging方法,我們可以直接使用WebApplicationBuilderLogging屬性:

builder.Logging.AddConfiguration(builder.Configuration.GetSection("Logging")); 
builder.Logging.AddConsole(); 
builder.Logging.AddDebug();

現在我們已經了解了如何配置日志記錄,接下來我們看看如何自定義日志記錄。

創建自定義日志記錄

為了演示,我們這里創建一個小而簡單的日志記錄器,它能夠在控制臺中使用特定的日志級別對日志條目進行著色。此日志記錄稱為ColoredConsoleLogger,它會使用LoggerProvider創建。要指定顏色和日志級別,我們還需要添加一個配置類Configuration

在接下來的代碼片段中,將分別創建這三個關鍵類(ConfigurationLoggerProviderLogger):

1.ColoredConsoleLoggerConfiguration

我們創建一個名為CustomLogger.cs的文件中,它與Program.cs位于同一文件夾中,我們在CustomLogger.cs中創建ColoredConsoleLoggerConfiguration,該配置類包含三個可設置的屬性:LogLevelEventIdColor

public class ColoredConsoleLoggerConfiguration 
{     public LogLevel LogLevel { get; set; } = LogLevel.Warning;     public int EventId { get; set; } = 0;    public ConsoleColor Color { get; set; } = ConsoleColor.Yellow; 
}

2.ColoredConsoleLoggerProvider

接下來,我們需要一個提供程序來檢索配置并創建實際的日志記錄實例

public class ColoredConsoleLoggerProvider : ILoggerProvider 
{     private readonly ColoredConsoleLoggerConfiguration _config;     private readonly ConcurrentDictionary<string, ColoredConsoleLogger> _loggers = new ConcurrentDictionary<string,ColoredConsoleLogger>();     public ColoredConsoleLoggerProvider (ColoredConsoleLoggerConfiguration config) { _config = config; }     public ILogger CreateLogger(string categoryName) { return _loggers.GetOrAdd(categoryName,name => new ColoredConsoleLogger(name, _config));     }public void Dispose() {_loggers.Clear(); } 
}

不要忘記引入System.Collections.Concurrent

3.ColoredConsoleLogger

第三類是我們真正使用的日志記錄器:

public class ColoredConsoleLogger : ILogger
{private static readonly object _lock = new Object();private readonly string _name;private readonly ColoredConsoleLoggerConfiguration _config;public ColoredConsoleLogger(string name,ColoredConsoleLoggerConfiguration config){_name = name;_config = config;}public IDisposable BeginScope<TState>(TState state){return null;}public bool IsEnabled(LogLevel logLevel){return logLevel == _config.LogLevel;}public void Log<TState>(LogLevel logLevel,EventId eventId,TState state,Exception exception,Func<TState, Exception, string> formatter){if (!IsEnabled(logLevel)){return;}lock (_lock){if (_config.EventId == 0 || _config.EventId == eventId.Id){var color = Console.ForegroundColor;Console.ForegroundColor = _config.Color;Console.Write($"{logLevel} - ");Console.Write($"{eventId.Id} - {_name} - ");Console.Write($"{formatter(state, exception)}\n");Console.ForegroundColor = color;}}}
}

我們現在需要lock(鎖定) 控制臺的輸出——這是因為控制臺本身并不是真正的線程安全的,可能出現錯誤的著色。

完成后,我們可以將新的記錄插入到Program.cs的配置中。

using LoggingSample;builder.Logging.ClearProviders();
var config = new ColoredConsoleLoggerConfiguration
{LogLevel = LogLevel.Information,Color = ConsoleColor.Red
};
builder.Logging.AddProvider(new ColoredConsoleLoggerProvider(config));

首先需要向引入LoggerSample命名空間。

using LoggingSample;

如果不想使用現有的日志框架,可以清除之前添加的所有日志框架提供程序

builder.Logging.ClearProviders();

然后,我們調用AddProvider來添加ColoredConsoleLoggerProvider實例。

這里配置了不同的日志級別,您可以使用這種方法發送有關錯誤的電子郵件,或者將調試消息記錄到別的日志接收器等等。

下圖顯示了日志框架的彩色輸出:

a7aca45319f5de27743ab85cb3b2874f.png

在許多時候,編寫自定義日志框架是沒有意義的,因為已經有許多優秀的第三方日志記錄框架可用,例如ELMAHlog4netNLog

下面,我們將介紹如何在ASP.NET Core中使用NLog

使用第三方日志框架NLog

NLog是最早的一款可用于ASP.NET Core的日志框架,NLog提供了一個日志記錄提供程序插件,可以方便地插入ASP.NET Core。(你可以通過NuGet找到NLog)

1.配置Nlog

我們需要添加一個NLog.Config配置文件,用于定義兩個不同的日志記錄:

  1. 所有標準消息記錄在一個日志文件中;

  2. 而自定義消息記錄在另一個文件中

<targets><!-- 標準消息 --><target xsi:type="File" name="allfile" fileName="C:\git\dotnetconf\001-logging\nlog-all-${shortdate}.log"layout="${longdate}|${event-properties:item=EventId.Id}|${logger}|${uppercase:${level}}|${message} ${exception}" /><!-- 自定義消息 --><target xsi:type="File" name="ownFile-web" fileName="C:\git\dotnetconf\001-logging\nlog-own-${shortdate}.log"layout="${longdate}|${event-properties:item=EventId.Id}|${logger}|${uppercase:${level}}|  ${message} ${exception}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" /><target xsi:type="Null" name="blackhole" /></targets><!-- rules to map from logger name to target --><rules><!--All logs, including from Microsoft--><logger name="*" minlevel="Trace" writeTo="allfile" /><!--Skip Microsoft logs and so log only own logs--><logger name="Microsoft.*" minlevel="Trace" writeTo="blackhole" final="true" /><logger name="*" minlevel="Trace" writeTo="ownFile-web" /></rules>

2.引入NuGet包

然后我們需要NuGet添加NLogASP.NET Core包:

dotnet add package NLog.Web.AspNetCore

3.將NLogIWebHostBuilder結合使用

清除ConfigureLogging方法中的其他提供程序,使用UseNLog()方法將NLogIWebHostBuilder結合使用:

Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder => {         webBuilder.ConfigureLogging((hostingContext,logging) => {      //清除其他提供程序       logging.ClearProviders();                 logging.SetMinimumLevel(LogLevel.Trace);             }).UseNLog().UseStartup<Startup>();     
});

使用minimal API看起來簡單得多:

using NLog.Web; var builder = WebApplication.CreateBuilder(args); //清除其他提供程序  
builder.Logging.ClearProviders(); 
builder.Logging.SetMinimumLevel(LogLevel.Trace); 
builder.WebHost.UseNLog();

在這里,您可以根據需要添加任意多個日志記錄提供程序。

回顧 & 思考

現在,讓我們回顧一下本文所涵蓋的內容:

  • 配置日志記錄

  • 創建自定義日志記錄

  • 使用第三方日志框架

思考:我們應該如何自定義應用的配置?歡迎關注下篇內容《如何自定義.NET 6.0的應用配置》。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/287241.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/287241.shtml
英文地址,請注明出處:http://en.pswp.cn/news/287241.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

FreeMarker標簽介紹

轉自&#xff1a;http://www.blogjava.net/kxbin/articles/366505.html FreeMarker標簽使用 一、FreeMarker模板文件主要有4個部分組成 1、文本&#xff0c;直接輸出的部分 2、注釋&#xff0c;即<#--...-->格式不會輸出 3、插值&#xff08;Interpolation&#xff09…

利用Erdas監督分類方法提取城鎮用地信息完整實驗操作步驟

打開erdas,分波段加載landsat TM 影像信息,并轉成img圖像格式文件。 1.打開erdas,點擊viewer打開新窗口,點擊打開圖標,選擇要加載的一個波段的tif圖像,點擊OK。 2.點擊主窗口File——Save——Top Layer As…,在跳出的Save窗

linux命令 su和sudo,Linux中sudo和su的區別

介紹&#xff1a;主要對su和sudo的功能&#xff0c;區別以及使用進行介紹。兩者之間的區別su用于用戶之間的切換&#xff1b;sudo用于普通用戶可以使用root權限來執行指定命令&#xff1b;命令介紹1. susu簡介su用于用戶之間的切換。但是前面的用戶依然保持在登錄狀態。這種切換…

通過Xshell上傳下載文件

2019獨角獸企業重金招聘Python工程師標準>>> 1&#xff09;安裝模塊 yum install lrzsz 2&#xff09;使用命令 rz #上傳文件到Linux sz hello.txt #從Linux下載文件hello.txt 轉載于:https://my.oschina.net/u/2351685/blog/519941

Centos 安裝配置 vsftpd

為什么80%的碼農都做不了架構師&#xff1f;>>> 一、安裝vsftpd 執行 yum -y install vsftpd (rpm -qa|grep vsftpd 可查看是否已安裝vsftpd, 默認配置文件在/etc/vsftpd/vsftpd/conf) 二、創建虛擬用戶 選擇在根目錄或者用戶目錄下創建ftp文件夾&#xff1a;mkdir…

《看聊天記錄都學不會Python到游戲實戰?太菜了吧》(6)不會這個知識點代碼越寫越難

本系列文章將會以通俗易懂的對話方式進行教學&#xff0c;對話中將涵蓋了新手在學習中的一般問題。此系列將會持續更新&#xff0c;包括別的語言以及實戰都將使用對話的方式進行教學&#xff0c;基礎編程語言教學適用于零基礎小白&#xff0c;之后實戰課程也將會逐步更新。 若…

Android之各個手機版本WiFi熱點的創建

1 問題 Android手機創建熱點,有很多兼容性問題,網上有很多例子,但是不夠全,而且高版本反射很多奔潰,我這里再總結下。 2 版本兼容和需要的權限已經熱點IP地址說明 1)AndroidMainifest.xml里面需要添加的權限 <uses-permission android:name="android.permissio…

你還在用GIF?那就out了

前言今天介紹一篇使用json格式在wpf中播放動畫效果&#xff1b;正文話說在上古&#xff08;1987&#xff09;時代&#xff0c;Gif因其體積小成像相對清晰和非常強的兼容性&#xff0c;而大受歡迎;Gif也因為當時的技術限制導致很多缺陷 這包括對電腦的內存和性能占用非常大;同時…

【攝影測量原理】第一章:攝影測量學基礎

目 錄 第一節 攝影測量學的定義、任務 第二節 攝影測量與遙感的分類 第三節 攝影測量與遙感的發展歷程 第四節 遙感主要應用領域及3S技術 第一節 攝影測量學的定義、任務 先來看一下例子&#xff1a; 思考&#xff1a; 1、攝影測量去常規測量的相同點與不同點&#…

Linux source命令

Linux source命令&#xff1a; 通常用法&#xff1a;source filepath 或 . filepath 功能&#xff1a;使當前shell讀入路徑為filepath的shell文件并依次執行文件中的所有語句&#xff0c;通常用于重新執行剛修改的初始化文件&#xff0c;使之立即生效&#xff0c;而不必注銷并重…

linux下覆蓋文件命令,在Linux中使用命令行進行文件覆蓋的操作

習慣了freebsd里的cp/rm/mv等命令遇到同名文件時直接覆蓋操作&#xff0c;而在linux中(不一定是全部&#xff0c;可能是我使用的幾種)&#xff0c;使用cp/rm/mv命令覆蓋文件操作時總是提示輸入yes或no&#xff0c;很是麻煩&#xff0c;一兩個的也就算了&#xff0c;沒什么&…

云堆棧三大服務模式解析

如果準備使用云計算或者要在自己的IT環境中部署云計算&#xff0c;首先要確定合適的服務模式。這就需要我們對每種服務模式含義和特點都有所了解&#xff0c;很清楚從中能夠獲得哪些有益東西。正所謂“知己知彼百戰不殆”&#xff0c;我們要對自己想要得到什么非常了解&#xf…

Android之瀏覽器作為客戶端訪問手機socket作為服務端下載圖片和網頁和APK

1 需求 在同一局域網內,手機(PC端)瀏覽器作為客戶端,然后手機app里面通過socket寫服務代碼,然后瀏覽器訪問手機服務端的網頁和圖片和css文件和下載APK 2 代碼實現 創建服務線程代碼 var serverSocket: ServerSocket? = nullvar run = trueinner class HttpServerThrea…

Excel數據生成SQL insert語句

CONCATENATE("insert into teacher(ID, NAME, ADDRESS) values (",A1,",",B1,",",C1,");")轉載于:https://blog.51cto.com/kxtand/1704951

《看聊天記錄都學不會Python到游戲實戰?太菜了吧》(5)用前朝的劍斬今朝的官

本系列文章將會以通俗易懂的對話方式進行教學&#xff0c;對話中將涵蓋了新手在學習中的一般問題。此系列將會持續更新&#xff0c;包括別的語言以及實戰都將使用對話的方式進行教學&#xff0c;基礎編程語言教學適用于零基礎小白&#xff0c;之后實戰課程也將會逐步更新。 若…

【攝影測量原理】第二章:單幅影像解析基礎

本章提綱: 第一節 空中攝影基本知識第二節 中心投影與正射投影第三節 共線方程第四節 航攝像片的像點位移第五節 單幅影像解析基礎第一節 空中攝影基本知識 2.1.1 航空攝影機 1. 光學航空攝影機 <

Blazor Hybrid / MAUI 簡介和實戰

1. BlazorBlazor 是一個使用 .NET 生成交互式客戶端 Web UI 的框架&#xff1a;使用 C# 代替 JavaScript 來創建信息豐富的交互式 UI。共享使用 .NET 編寫的服務器端和客戶端應用邏輯。將 UI 呈現為 HTML 和 CSS&#xff0c;以支持眾多瀏覽器&#xff0c;其中包括移動瀏覽器。與…

linux下ffmpeg編譯成so文件,一、ffmpeg編譯成android使用的so庫

1.在https://ffmpeg.org/中下載ffmpeg源碼(目前版本為ffmpeg-3.2.1)2.下載ndk3.分別解壓ffmpeg和ndk&#xff0c; 路徑如 &#xff1a;ffmpeg路徑&#xff1a;/home/lx/Downloads/ffmpeg-3.2.1ndk路徑&#xff1a;/home/lx/Downloads/android-ndk-r13b4.替換ffmpeg-3.2.1/confi…

SpringMVC總結帖

SpringMVC是基于MVC設計理念的一款優秀的Web框架&#xff0c;是目前最流行的MVC框架之一&#xff0c;SpringMVC通過一套注解&#xff0c;讓POPJ成為處理請求的控制器&#xff0c;而無需實現任何接口&#xff0c;然后使用實現接口的控制器也完全沒問題&#xff1b;支持REST風格的…

Android之RxPermissions用kotlin寫沒反應

1 問題 用rxPermisssons下面的寫法沒反應 RequiresApi(Build.VERSION_CODES.N)fun test(){val rxPermissions RxPermissions(this)rxPermissions.requestEach(Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE).subscribe {object : Consumer<Perm…