.Net日志系統Logging-五

日志概念

? ? ? ? 日志級別

? ? ? NET (Microsoft.Extensions.Logging) 中定義的?6 個標準日志級別,按嚴重性從低到高排列:

日志級別數值描述典型使用場景
Trace0最詳細的信息,包含敏感數據(如請求體、密碼哈希等)。僅在開發或深度故障排除時啟用。記錄方法入口/出口、詳細變量值、低級別通信細節。
Debug1開發調試信息。比?Trace?略少細節,但仍包含對開發者有用的內部信息。記錄關鍵變量狀態、流程步驟、非性能關鍵操作的耗時、配置加載值。
Information2應用程序流信息。描述應用程序正常、預期內的操作。服務啟動/停止、重要操作完成(如“用戶登錄成功”、“訂單創建”)、主要里程碑事件。
Warning3異常或意外事件,但應用程序仍能繼續運行。表明可能需要調查的潛在問題。重試操作、降級功能使用、預期內的外部服務錯誤、接近資源限制(如磁盤空間不足)。
Error4無法處理的錯誤。表示當前操作或請求失敗,但應用程序整體仍可運行。捕獲的異常、數據庫連接失敗、關鍵操作失敗(如支付處理失敗)、外部API調用關鍵錯誤。
Critical5最嚴重的故障,可能導致應用程序崩潰或不可恢復的損壞。需要立即處理。系統崩潰、數據丟失、磁盤空間耗盡、啟動失敗、災難性未處理異常。

? ? ? ? 日志提供者:需要把日志輸出那個地方文件,數據庫,控制臺等。

? ? ? ??

輸出日志到控制臺

1.安裝Nuget日志所需要的包:

????????Microsoft.Extensions.Logging.Console

2.DI注入:

//創建DI容器對象
ServiceCollection services = new ServiceCollection();

? ? ? ?
?services.AddLogging(logBuilder => {
? ? ?//容器注入控制臺輸出
? ? ?logBuilder.AddConsole();

詳細步驟:

1.創建一個類,使用構造方法注入ILogger<一般填寫當前類名>?

 class TestLog
{//定義一個ILogger類型私有變量,泛型中類型填寫本類private readonly ILogger<TestLog> logger;//使用構造方法進行注入public TestLog(ILogger<TestLog> logger) { this.logger = logger;}public void Log(){logger.LogDebug("調試記錄信息");logger.LogWarning("警告記錄信息");logger.LogError("錯誤記錄信息");}}

2.在主程序中創建DI容器,注冊服務、添加控制器輸出

 public class Program{static void Main(string[] args){//創建DI容器對象ServiceCollection services = new ServiceCollection();services.AddLogging(logBuilder => {//-----------------------------------//容器注入控制臺輸出logBuilder.AddConsole();//--------------------------------------//設置輸出級別為最低logBuilder.SetMinimumLevel(LogLevel.Trace);  });//容器注冊服務對象services.AddScoped<TestLog>();//構建一個服務提供者(Service Provider)對象//創建一個 `ServiceProvider` 實例。//-這個 `ServiceProvider` 對象就是依賴注入容器,它負責管理服務的生命周期和解析服務using (var sp = services.BuildServiceProvider()){//獲取服務對象TestLog tlog =   sp.GetRequiredService<TestLog>();tlog.Log();Console.ReadKey();}}}

3.輸出結果

輸出日志到Windows的事件查看器中

1.創建一個類,使用構造方法注入ILogger<一般填寫當前類名>?

 class TestLog
{//定義一個ILogger類型私有變量,泛型中類型填寫本類private readonly ILogger<TestLog> logger;//使用構造方法進行注入public TestLog(ILogger<TestLog> logger) { this.logger = logger;}public void Log(){logger.LogDebug("調試記錄信息");logger.LogWarning("警告記錄信息");logger.LogError("錯誤記錄信息");}}

2.在主程序中創建DI容器,注冊服務、添加事件查看器輸出

 public class Program{static void Main(string[] args){//創建DI容器對象ServiceCollection services = new ServiceCollection();services.AddLogging(logBuilder => {//---------------------------------------//注入windows事件查看器中輸出logBuilder.AddEventLog();//---------------------------------------//設置輸出級別為最低logBuilder.SetMinimumLevel(LogLevel.Trace);  });//容器注冊服務對象services.AddScoped<TestLog>();//構建一個服務提供者(Service Provider)對象//創建一個 `ServiceProvider` 實例。//-這個 `ServiceProvider` 對象就是依賴注入容器,它負責管理服務的生命周期和解析服務using (var sp = services.BuildServiceProvider()){//獲取服務對象TestLog tlog =   sp.GetRequiredService<TestLog>();tlog.Log();Console.ReadKey();}}}

3.輸出結果

NLog文本日志輸出

1.安裝Nuget包:NLog.Extensions.Logging

控制臺輸入:Install-Package  NLog.Extensions.Logging

2..創建配置文件
添加?nlog.config?配置文件(右鍵項目 → 新建項 → NLog 配置文件),nlog.config?位于項目根目錄

內容示例如下:

<?xml version="1.0" encoding="utf-8"?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"autoReload="true"internalLogLevel="info"internalLogFile="interal_NLog.log"throwExceptions="false" encoding="utf-8"><targets><!-- 控制臺輸出 ,layout輸出布局格式--><target name="console" xsi:type="Console" layout="${longdate}|${level}|${message}" /><!-- 文件輸出(按日期分目錄) --><target name="file" xsi:type="File" fileName="Logs/${date:format=yyyy}/${date:format=MM}/${shortdate}.log"layout="${longdate}|${level}|${logger}|${message} ${exception}" /></targets><rules><!--輸出日志的匹配規則 ,以name名稱進行匹配,輸入日志的等級,輸出到哪里--><logger name="*" minlevel="Info" writeTo="console,file" /><logger name="*" minlevel="Debug" writeTo="file" /></rules>
</nlog>

關鍵設置:將文件屬性設為?復制到輸出目錄:【始終復制

3.創建一個類,使用構造方法注入ILogger<一般填寫當前類名>?

 class TestLog
{//定義一個ILogger類型私有變量,泛型中類型填寫本類private readonly ILogger<TestLog> logger;//使用構造方法進行注入public TestLog(ILogger<TestLog> logger) { this.logger = logger;}public void Log(){logger.LogDebug("調試記錄信息");logger.LogWarning("警告記錄信息");logger.LogError("錯誤記錄信息");}}

4.在主程序中創建DI容器,注冊服務、添加Nlog文本輸出

 public class Program{static void Main(string[] args){//創建DI容器對象ServiceCollection services = new ServiceCollection();services.AddLogging(logBuilder => {//========================NLog日志========================//注入NLog日志logBuilder.AddNLog();//========================================================//設置輸出級別為最低logBuilder.SetMinimumLevel(LogLevel.Trace);  });//容器注冊服務對象services.AddScoped<TestLog>();//構建一個服務提供者(Service Provider)對象//創建一個 `ServiceProvider` 實例。//-這個 `ServiceProvider` 對象就是依賴注入容器,它負責管理服務的生命周期和解析服務using (var sp = services.BuildServiceProvider()){//獲取服務對象TestLog tlog =   sp.GetRequiredService<TestLog>();tlog.Log();Console.ReadKey();}}}

配置高級設置

  1. 異步日志提升性能

    <!-- AsyncWrapper 時會自動啟用批量寫入-->
    <target name="asyncFile" xsi:type="AsyncWrapper"><target xsi:type="File" fileName="logs/async.log" KeepFileOpen=false async="true"/>
    </target>
    • 避免阻塞主線程,適合高并發場景。

  2. 全局診斷上下文(GDC)

    • 設置全局變量(如應用版本):

      NLog.GlobalDiagnosticsContext.Set("AppVersion", "2.0.0");
    • 配置中引用:

      ${gdc:item=AppVersion}

  3. 日志輪轉與壓縮

    <target xsi:type="File" fileName="logs/app.log"maxArchiveFiles="30"          <!-- 保留30個文件 -->archiveAboveSize="10485760"   <!-- 單個文件 >10MB 時分割 -->enableArchiveFileCompression="true" /> <!--啟用文檔壓縮 -->


??五、性能優化建議

  • 緩沖寫入:減少 I/O 操作

    <target xsi:type="BufferingWrapper" bufferSize="1000"><target xsi:type="File" fileName="logs/buffered.log" />
    </target>
  • 按環境調整日志級別

    • 開發環境:Debug

    • 生產環境:Warn?或?Error

  • 條件日志記錄:避免不必要的計算

    if (logger.IsEnabled(LogLevel.Debug)) 
    {var data = ExpensiveOperation();logger.Debug(data);
    }

    目標標簽配置選項:

  • File target · NLog/NLog 數據庫https://github.com/NLog/NLog/wiki/Database-target

  • File target · NLog/NLog Wiki · GitHubhttps://github.com/NLog/NLog/wiki/File-target

  • NLog 和 SQL Server 示例配置

    <target name="database" xsi:type="Database"><connectionString>server=localhost;Database=*****;user id=****;password=*****</connectionString><!--數據庫中創建日志表Script for creating the dbo.Log table.SET ANSI_NULLS ONSET QUOTED_IDENTIFIER ONCREATE TABLE [dbo].[Log] ([Id] [int] IDENTITY(1,1) NOT NULL,[MachineName] [nvarchar](50) NOT NULL,[Logged] [datetime] NOT NULL,[Level] [nvarchar](50) NOT NULL,[Message] [nvarchar](max) NOT NULL,[Logger] [nvarchar](250) NULL,[Exception] [nvarchar](max) NULL,CONSTRAINT [PK_dbo.Log] PRIMARY KEY CLUSTERED ([Id] ASC)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]) ON [PRIMARY]--><commandText>insert into dbo.Log (MachineName, Logged, Level, Message,Logger, Exception) values (@MachineName, @Logged, @Level, @Message,@Logger, @Exception);</commandText><parameter name="@MachineName" layout="${machinename}" /><parameter name="@Logged" layout="${date}" /><parameter name="@Level" layout="${level}" /><parameter name="@Message" layout="${message}" /><parameter name="@Logger" layout="${logger}" /><parameter name="@Exception" layout="${exception:tostring}" />
    </target>

    Serilog結構化日志輸出

  • 官方文檔:NuGet 庫 |Serilog.AspNetCore 9.0.0https://www.nuget.org/packages/Serilog.AspNetCore/9.0.0
  • 安裝Nuget包:
    • Serilog.AspNetCore

日志設置:

Log.Logger = new LoggerConfiguration().MinimumLevel.Debug().MinimumLevel.Override("Microsoft", LogEventLevel.Information).Enrich.FromLogContext().WriteTo.Console()// Add this line:.WriteTo.File(//連接路徑 存放位置:C:\Users\xxxxxx\LogFiles\Application\diagnostics.txtSystem.IO.Path.Combine(Environment.GetEnvironmentVariable("HOME"), "LogFiles", "Application", "diagnostics.txt"),rollingInterval: RollingInterval.Day,fileSizeLimitBytes: 10 * 1024 * 1024,retainedFileCountLimit: 2,rollOnFileSizeLimit: true,shared: true,flushToDiskInterval: TimeSpan.FromSeconds(1)).CreateLogger();//添加serilog日志對象services.AddSerilog();

完整代碼:

1.安裝serilog包:

? ? ? ?

 Install-Package? Serilog.AspNetCore

2.創建一個類,使用構造方法注入ILogger<一般填寫當前類名>?

 class TestLog
{//定義一個ILogger類型私有變量,泛型中類型填寫本類private readonly ILogger<TestLog> logger;//使用構造方法進行注入public TestLog(ILogger<TestLog> logger) { this.logger = logger;}public void Log(){logger.LogDebug("調試記錄信息");logger.LogWarning("警告記錄信息");logger.LogError("錯誤記錄信息");}}

3.在主程序中創建DI容器,注冊服務、添加serilog文本輸出

public class Program
{static void Main(string[] args){//創建DI容器對象ServiceCollection services = new ServiceCollection();services.AddLogging(logBuilder => {//存放日志路徑string path = System.IO.Path.Combine(Environment.GetEnvironmentVariable("HOME"), "LogFiles", "Application", "diagnostics.txt");//serilog日志的設置Log.Logger = new LoggerConfiguration().MinimumLevel.Debug().Enrich.FromLogContext().WriteTo.Console(new JsonFormatter()).WriteTo.File(path,rollingInterval: RollingInterval.Day,fileSizeLimitBytes: 10 * 1024 * 1024,retainedFileCountLimit: 2,rollOnFileSizeLimit: true,shared: true,flushToDiskInterval: TimeSpan.FromSeconds(1)).CreateLogger();//添加serilog日志對象logBuilder.AddSerilog();//設置輸出級別為最低logBuilder.SetMinimumLevel(LogLevel.Trace);  });//容器注冊服務對象services.AddScoped<TestLog>();//構建一個服務提供者(Service Provider)對象//創建一個 `ServiceProvider` 實例。//-這個 `ServiceProvider` 對象就是依賴注入容器,它負責管理服務的生命周期和解析服務using (var sp = services.BuildServiceProvider()){//獲取服務對象TestLog tlog =   sp.GetRequiredService<TestLog>();tlog.Log();Console.ReadKey();}}
}

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

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

相關文章

中國貿促會融媒體中心出海活動負責人、出海星球創始人蒞臨綠算技術

近日&#xff0c;中國貿促會融媒體中心出海活動負責人、出海星球創始人王思諾一行蒞臨廣東省綠算技術有限公司&#xff0c;深入考察其核心技術產品與全球化布局。雙方圍繞綠算技術全棧產品體系、創新出海模式及生態共建展開深度對話。綠算技術作為國內智算基礎設施領域的領軍企…

【算法專題訓練】06、數組雙指針

1、數組 數組是由相同類型的元素組成的數據集合&#xff0c;并且占據一塊連續的內存&#xff0c;按照順序存儲數據。 1.1、數組的特性&#xff1a; 數組元素通過下標獲取數據數組對象初始化時&#xff0c;需要先指定數組容量大小&#xff0c;并根據容量大小分配內存。缺點&…

操作系統-lecture2(操作系統結構)

回顧下lecture1 swap區域不可以馬上執行&#xff0c;即虛擬內存的數據和指令不可以被執行&#xff0c;得交換回到內存區域 操作系統的服務 主要提供兩種服務 面向普通用戶&#xff1a;user interface面向程序員&#xff1a;應用級程序代碼 為用戶 為用戶提供了操作包括但不…

內網服務器實現從公網穿透

從6月份tplink的ddns失效之后&#xff0c;對于部分在內網運行的服務器&#xff0c;從公網訪問就收到了部分影響。有好幾個朋友找來&#xff0c;尋求幫助&#xff0c;看看怎么恢復原來的機制&#xff0c;可以從公網互聯網訪問內網服務器。方案一&#xff1a;如果有動態公網的客戶…

vcs-編譯+仿真+dump波形【IMP】

VCS仿真分為兩步式(編譯/compilation仿真/simulation)和三步式(分析/analysis細化/elaborationsimulation/仿真);注2:analysis/分析是三步式flow中仿真design的第一步&#xff0c;在此階段將使用vhdlan或vlogan分析VHDL、Verilog、SystemVerilog和OpenVera文件。下面的部分包括…

程序代碼篇---python向http界面發送數據

在 Python 中向 HTTP 界面發送數據&#xff0c;本質上是模擬用戶在網頁上填寫表單、點擊提交按鈕的過程。這在自動化測試、數據上報、接口調用等場景中非常常用。下面用通俗易懂的方式介紹具體方法、實例代碼和解析。核心原理網頁上的數據發送&#xff08;比如提交表單&#xf…

mybatis-plus由mysql改成達夢數據庫

前置條件: 達夢數據庫設置了大小寫敏感,我比較菜,改不動!先這么湊合著用吧; 因為設置了大小寫敏感,所以所有的sql語句都要加 引號; 這樣是會報錯的: SELECT remark,createDept,createBy,createTime,updateBy,updateTime FROM sys_oss_config這樣才可以 SELECT "create_…

設計模式:外觀模式 Facade

目錄前言問題解決方案結構代碼前言 外觀是一種結構型設計模式&#xff0c;能為程序庫、框架或其他復雜類提供一個簡單的接口。 問題 假設你必須在代碼中使用某個復雜的庫或框架中的眾多對象。正常情況下&#xff0c; 你需要負責所有對象的初始化工作、 管理其依賴關系并按正確…

【數據結構初階】--二叉樹(四)

&#x1f525;個人主頁&#xff1a;草莓熊Lotso &#x1f3ac;作者簡介&#xff1a;C研發方向學習者 &#x1f4d6;個人專欄&#xff1a; 《C語言》 《數據結構與算法》《C語言刷題集》《Leetcode刷題指南》 ??人生格言&#xff1a;生活是默默的堅持&#xff0c;毅力是永久的…

三、平面度檢測-差值法

方法一: dev_get_window (WindowHandle) *讀取3通道彩色融合圖 read_image (Image, ./XYZ彩色融合圖.tiff) *拆分3個通道 decompose3 (Image, x, y, z) *將3個通道圖像轉換為3D模型 xyz_to_object_model_3d (x,y, z, ObjectModel3D) *顯示動態3D模型 threshold (z, Regions,…

什么是數據編排?數據編排的流程、優勢、挑戰及工具有哪些?

目錄 一、數據編排的定義與概念 1.數據編排的基本含義 2.數據編排與相關概念的區別 3.數據編排的重要性 二、數據編排的流程 1.需求分析&#xff1a; 2.數據源識別與連接&#xff1a; 3.數據抽取&#xff1a; 4.數據轉換&#xff1a; 5.數據加載&#xff1a; 6.監控…

【C++算法】82.BFS解決FloodFill算法_被圍繞的區域

文章目錄題目鏈接&#xff1a;題目描述&#xff1a;解法C 算法代碼&#xff1a;題目鏈接&#xff1a; 130. 被圍繞的區域 題目描述&#xff1a; 解法 BFS一層層剝開。 C 算法代碼&#xff1a; class Solution {// 定義四個方向的偏移量&#xff1a;右、左、下、上int dx[4] …

商湯發布具身智能平臺,讓機器人像人一樣和現實世界交互

7月27日&#xff0c;在“大愛無疆模塑未來”WAIC 2025大模型論壇上&#xff0c;商湯科技重磅發布「悟能」具身智能平臺。「悟能」具身智能平臺以商湯具身世界模型為核心引擎&#xff0c;依托商湯大裝置提供端側和云側算力支持&#xff0c;能夠為機器人、智能設備提供強大的感知…

MCP工作原理

在談MCP原理前&#xff0c;我們先談談MCP的技術前身—Function Calling。1.Function Calling技術在FunctionCalling技術出現之前&#xff0c;大語言模型雖然擁有強大的知識儲備和語言理解能力&#xff0c;但是只能提供自身數據庫已有的信息&#xff0c;無法和外界進行信息交互。…

VSCode手動版本更新

技術背景 使用VSCode的的過程中&#xff0c;如果打開了自動更新功能&#xff0c;每隔一段時間就會有更新提示。為了保持版本的穩定性&#xff0c;我們可以在設置中將Update: Mode設置為none&#xff0c;這樣就不會觸發自動更新。但有時又有版本更新的需求&#xff0c;可能是版本…

醫療超聲成像專用AFE模擬前端

醫療超聲成像作為一種廣泛應用于臨床診斷的重要技術&#xff0c;對于提供清晰、準確的醫學圖像起著關鍵作用。在超聲成像系統中&#xff0c;AFE模擬前端扮演著至關重要的角色。它負責對超聲換能器接收到的微弱電信號進行處理和轉換&#xff0c;為后續的數字信號處理提供高質量的…

機器學習之線性回歸——小白教學

一、線性回歸簡介1.什么是線性回歸線性回歸(Linear regression)是利?回歸?程(函數)對?個或多個?變量(特征值)和因變量(?標值)之間關系進?建模的?種分析?式。特點&#xff1a;只有?個?變量的情況稱為單變量回歸&#xff0c;多于?個?變量情況的叫做多元回歸線性回…

.NET 10 中的新增功能系列文章1——運行時中的新增功能

引言 隨著 .NET 10 預覽版6的發布&#xff0c;微軟在運行時層面帶來了一系列重要的性能改進和新功能。這些改進主要集中在JIT編譯器優化、硬件指令集支持、內存管理等方面&#xff0c;旨在進一步提升應用程序的執行效率和資源利用率。本文將詳細解析這些運行時增強功能&#x…

安寶特方案丨AI算法能力開放平臺:適用于人工裝配質檢、點檢、實操培訓

當前工業AI圖形識別算法的應用存在投入成本高、維護更新難、依賴固定相機、應用范圍窄、與實際作業脫節等問題。 針對以上情況&#xff0c;安寶特提出了“AI算法能力開放平臺”&#xff0c;目的是讓AI圖形識別算法可以與現場實際的人工點檢作業、裝配作業、質檢作業、培訓作業…

水下目標識別準確率↑89%!陌訊多模態融合算法在智慧水務的落地實踐

一、行業痛點&#xff1a;智慧水務的檢測困境據《2024城市水務智能化白皮書》統計&#xff0c;傳統水務檢測面臨三大挑戰&#xff1a;??水體干擾??&#xff1a;渾濁度>100NTU時&#xff0c;目標漏檢率高達65%??動態環境??&#xff1a;水流擾動導致目標形變&#xff…