【后端】.NET Core API框架搭建(9) --配置使用Log4Net日志

???????

目錄

1.添加包

2.新建公用類

3.新建配置

4.注冊

? ? ? ? 4.1.類庫項目設置

5.使用


?????????在 .NET Core 項目中使用 Log4Net 做日志記錄,具有很多優勢。盡管 .NET Core 自帶了 ILogger 接口(如使用內置的 ConsoleLoggerDebugLogger 等),但 Log4Net 提供了更強大、靈活和可配置的日志功能,尤其適合企業級應用或需要精細控制日志輸出的場景。

1.添加包

? ? ? ? 添加?log4net 和?Microsoft.Extensions.Logging.Log4Net.AspNetCore 包。

2.新建公用類

? ? ? ? 創建?LogHelper 公共靜態類。

using log4net;
using System.Collections.Concurrent;
using System.Runtime.CompilerServices;namespace Frame5_LibraryLogger.LogHelper
{/// <summary>/// 日志類-記錄調用名稱/// </summary>public static class LogHelper{// 緩存 ILog 對象(線程安全)private static readonly ConcurrentDictionary<string, ILog> _loggerCache = new ConcurrentDictionary<string, ILog>();// 獲取 ILog 實例(確保只初始化一次)private static ILog GetLogger([CallerMemberName] string caller = ""){return _loggerCache.GetOrAdd(caller, LogManager.GetLogger);}/// <summary>/// 記錄 DEBUG 級別日志/// </summary>public static void Debug(string message, [CallerMemberName] string caller = ""){var logger = GetLogger(caller);if (logger.IsDebugEnabled)logger.Debug(message);}/// <summary>/// 記錄 INFO 級別日志/// </summary>public static void Info(string message, [CallerMemberName] string caller = ""){var logger = GetLogger(caller);if (logger.IsInfoEnabled)logger.Info(message);}/// <summary>/// 記錄 WARN 級別日志/// </summary>public static void Warn(string message, [CallerMemberName] string caller = ""){GetLogger(caller).Warn(message);}/// <summary>/// 記錄 ERROR 級別日志/// </summary>public static void Error(string message, Exception ex = null, [CallerMemberName] string caller = ""){var logger = GetLogger(caller);if (ex != null)logger.Error(message, ex);elselogger.Error(message);}/// <summary>/// 記錄 FATAL 級別日志/// </summary>public static void Fatal(string message, Exception ex = null, [CallerMemberName] string caller = ""){var logger = GetLogger(caller);if (ex != null)logger.Fatal(message, ex);elselogger.Fatal(message);}}
}

? ? ? ? 案例如下

3.新建配置

? ? ? ? 新建 log4net.config 應用程序配置文件

? ? ? ? 點擊所需項目 → 添加 → 新建項目 → 右上角搜索 應用程序配置文件

<?xml version="1.0" encoding="utf-8"?>
<!-- XML文件聲明,版本1.0,UTF-8編碼 -->
<log4net><!-- 開始log4net配置 --><!-- 關閉所有Microsoft開頭的命名空間日志 --><logger name="Microsoft"><level value="OFF" /></logger><!-- 關閉System開頭的命名空間日志 --><logger name="System"><level value="OFF" /></logger><!-- INFO級別日志配置開始 --><appender name="InfoFileAppender" type="log4net.Appender.RollingFileAppender"><!-- 定義一個名為InfoFileAppender的appender,使用滾動文件類型 --><file type="log4net.Util.PatternString" value="logs/INFO/INFO_" /><!-- 日志文件路徑模板,使用PatternString支持動態路徑 --><datePattern value="yyyy-MM-dd'.txt'" /><!-- 日期模式,用于文件滾動命名,每天生成一個新文件 --><staticLogFileName value="false" /><!-- 不使用靜態文件名,允許根據日期模式變化 --><appendToFile value="true" /><!-- 以追加模式寫入文件,不清空原有內容 --><rollingStyle value="Date" /><!-- 滾動策略:按日期滾動 --><layout type="log4net.Layout.PatternLayout"><!-- 定義日志輸出布局為模式布局 --><conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /><!-- 日志格式:%date - 日期時間[%thread] - 線程ID%-5level - 日志級別(左對齊,5字符寬度)%logger - 記錄器名稱%message - 日志消息%newline - 換行符--></layout><filter type="log4net.Filter.LevelMatchFilter"><!-- 添加級別匹配過濾器 --><levelToMatch value="INFO" /><!-- 只匹配INFO級別日志 --></filter><filter type="log4net.Filter.DenyAllFilter" /><!-- 拒絕所有不匹配的日志 --></appender><!-- DEBUG級別日志配置開始 --><appender name="DebugFileAppender" type="log4net.Appender.RollingFileAppender"><!-- 定義DEBUG級別appender --><file type="log4net.Util.PatternString" value="logs/DEBUG/DEBUG_" /><!-- DEBUG日志文件路徑 --><datePattern value="yyyy-MM-dd'.txt'" /><!-- 日期格式 --><staticLogFileName value="false" /><!-- 動態文件名 --><appendToFile value="true" /><!-- 追加模式 --><rollingStyle value="Date" /><!-- 按日期滾動 --><layout type="log4net.Layout.PatternLayout"><!-- 布局配置 --><conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /><!-- 同INFO格式 --></layout><filter type="log4net.Filter.LevelMatchFilter"><!-- DEBUG級別過濾器 --><levelToMatch value="DEBUG" /></filter><filter type="log4net.Filter.DenyAllFilter" /><!-- 拒絕其他級別 --></appender><!-- WARN級別日志配置開始 --><appender name="WarnFileAppender" type="log4net.Appender.RollingFileAppender"><!-- WARN級別appender定義 --><file type="log4net.Util.PatternString" value="logs/WARN/WARN_" /><!-- WARN日志路徑 --><datePattern value="yyyy-MM-dd'.txt'" /><!-- 日期格式 --><staticLogFileName value="false" /><!-- 動態文件名 --><appendToFile value="true" /><!-- 追加模式 --><rollingStyle value="Date" /><!-- 按日期滾動 --><layout type="log4net.Layout.PatternLayout"><!-- 布局配置 --><conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /></layout><filter type="log4net.Filter.LevelMatchFilter"><!-- WARN級別過濾器 --><levelToMatch value="WARN" /></filter><filter type="log4net.Filter.DenyAllFilter" /><!-- 拒絕其他級別 --></appender><!-- ERROR級別日志配置開始 --><appender name="ErrorFileAppender" type="log4net.Appender.RollingFileAppender"><!-- ERROR級別appender --><file type="log4net.Util.PatternString" value="logs/ERROR/ERROR_" /><!-- ERROR日志路徑 --><datePattern value="yyyy-MM-dd'.txt'" /><!-- 日期格式 --><staticLogFileName value="false" /><!-- 動態文件名 --><appendToFile value="true" /><!-- 追加模式 --><rollingStyle value="Date" /><!-- 按日期滾動 --><layout type="log4net.Layout.PatternLayout"><!-- 布局配置 --><conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /></layout><filter type="log4net.Filter.LevelMatchFilter"><!-- ERROR級別過濾器 --><levelToMatch value="ERROR" /></filter><filter type="log4net.Filter.DenyAllFilter" /><!-- 拒絕其他級別 --></appender><!-- FATAL級別日志配置開始 --><appender name="FatalFileAppender" type="log4net.Appender.RollingFileAppender"><!-- FATAL級別appender --><file type="log4net.Util.PatternString" value="logs/FATAL/FATAL_" /><!-- FATAL日志路徑 --><datePattern value="yyyy-MM-dd'.txt'" /><!-- 日期格式 --><staticLogFileName value="false" /><!-- 動態文件名 --><appendToFile value="true" /><!-- 追加模式 --><rollingStyle value="Date" /><!-- 按日期滾動 --><layout type="log4net.Layout.PatternLayout"><!-- 布局配置 --><conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /></layout><filter type="log4net.Filter.LevelMatchFilter"><!-- FATAL級別過濾器 --><levelToMatch value="FATAL" /></filter><filter type="log4net.Filter.DenyAllFilter" /><!-- 拒絕其他級別 --></appender><!-- 根記錄器配置開始 --><root><!-- 根日志記錄器配置 --><level value="ALL" /><!-- 記錄所有級別的日志 --><appender-ref ref="InfoFileAppender" /><!-- 引用INFO appender --><appender-ref ref="DebugFileAppender" /><!-- 引用DEBUG appender --><appender-ref ref="WarnFileAppender" /><!-- 引用WARN appender --><appender-ref ref="ErrorFileAppender" /><!-- 引用ERROR appender --><appender-ref ref="FatalFileAppender" /><!-- 引用FATAL appender --></root></log4net>
<!-- log4net配置結束 -->

? ? ? ? 案例如下

4.注冊

????????在 Program 或?Startup 中注冊日志。

//構建 log4net 配置文件的完整路徑
var configFilePath = Path.Combine(AppContext.BaseDirectory, "log4net.config");
//將 log4net 集成到 .NET Core 的統一日志系統中
builder.Logging.AddLog4Net(configFilePath);

? ? ? ? 案例如下

?

? ? ? ? 4.1.類庫項目設置

? ? ? ? 如果是類庫項目,需設置?log4net.config 文件屬性

? ? ? ? 點擊到文件 → 屬性 → 設置

????????復制到輸出目錄:始終賦值 / 如果較新則復制

? ? ? ? 生成操作: 內容

5.使用

? ? ? ? 在需要的地方可以隨意使用。

using Frame4_LibraryCore.BaseConfig;
using Frame5_LibraryLogger.LogHelper;
using Microsoft.AspNetCore.Mvc;namespace DemoAPI.Controllers
{/// <summary>/// 日志測試控制器/// </summary>//[Authorize]// 保護整個控制器[Route("api/[controller]/[action]")]//標記路由地址規格[ApiController] // 標記該類為 API 控制器,啟用一些默認的行為,如模型綁定、輸入驗證等[ApiExplorerSettings(GroupName = nameof(ApiVersionInfo.V1))]//設置控制器的API版本public class LoggerController : BaseController{/// <summary>/// 測試日志/// </summary>/// <returns></returns>[HttpGet]public bool InsertLogAsync(){//測試日志LogHelper.Info("Info");LogHelper.Error("Error");LogHelper.Debug("Debug");LogHelper.Fatal("Fatal");LogHelper.Warn("Warn");return true;}}
}

? ? ? ? 案例如下

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

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

相關文章

Agent交互細節

本文參考了https://www.bilibili.com/video/BV1v9V5zSEHA/視頻及原作者代碼實踐 本文主要實踐在第3節1、MCP MCP官方地址&#xff1a;https://modelcontextprotocol.io/introduction MCP 是一個開放協議&#xff0c;它規范了應用程序向 LLM 提供上下文的方式。 架構&#xff1a…

AI+醫療!VR和MR解剖學和針灸平臺,智能時代如何重塑健康未來

在智能時代&#xff0c;“AI醫療”正從精準診斷入手&#xff0c;推動醫療系統變革&#xff0c;通過個性化健康管理、智能診療輔助等方式重塑健康未來&#xff01;將人工智能&#xff08;AI&#xff09;與虛擬實境&#xff08;VR&#xff09;應用到中醫教學&#xff0c;透過該系…

Sersync和Rsync部署

學習參考連接 以下是我在學習過程中借鑒的經驗和下載資源鏈接&#xff0c;感謝幾位大佬的幫助&#xff0c;也供各位參考。 Rsync踩坑&#xff1a; https://blog.csdn.net/XiaoXiaoYunXing/article/details/120160395 Sersync下載源 http://down.whsir.com/downloads/sersy…

Django基礎(四)———模板常用過濾器

前言上篇文章給大家介紹了DTL模板的部分知識點這篇文章繼續帶大家深入理解Django框架中的模板過濾器一、模板常用過濾器1.add將傳進來的參數添加到原來的值上面。這個過濾器會嘗試將值和 參數轉換成整形然后進行相加。如果轉換成整形過程中失敗了&#xff0c;那么會將值和參數進…

國內MCP服務器搜索引擎有哪些?MCP導航站平臺推薦

在人工智能技術蓬勃發展的今天&#xff0c;AI模型與外部工具和服務的交互能力正成為推動技術進步的關鍵。AIbase&#xff08;<https://mcp.aibase.cn/>&#xff09;作為一個專注于MCP(Model Context Protocol&#xff0c;模型上下文協議)服務器的集合平臺&#xff0c;為全…

Python中with的作用和用法

在這里我們來詳細解釋一下Python中非常重要的 with 語句。 我會從 “為什么需要它” 開始&#xff0c;然后講解 “它是什么以及如何使用”&#xff0c;最后深入到 “它的工作原理” 和 “如何自定義”。1. 為什么需要 with 語句&#xff1f;(The Problem) 在編程中&#xff0c;…

緩存雪崩、緩存穿透,緩存擊穿

Redis是一個完全開源免費的高性能非關系型&#xff08;NOSQL&#xff09;的key-value數據庫。 Redis不可能把所有的數據都緩存起來(內存昂貴且有限)&#xff0c;所以Redis需要對數據 設置過期時間&#xff0c;并采用的是惰性刪除定期刪除兩種策略對過期鍵刪除。Redis對過期鍵的…

springmvc跨域解決方案

在Spring MVC中處理跨域請求&#xff08;CORS&#xff0c;Cross-Origin Resource Sharing&#xff09;通常涉及到配置HTTP響應頭&#xff0c;以允許來自不同源的請求。Spring MVC提供了多種方式來配置CORS&#xff0c;包括全局配置和局部配置。 使用CrossOrigin注解 在控制器的…

btstack移植之安全配對(二)

3.13.3 Legacy配對首先&#xff0c;我們回復的paring response中&#xff0c;可以看到我們不支持secure connection&#xff0c;所以我們走的是legacy配對模式。圖3-74 secure連接不支持然后&#xff0c;master在pairing confirm包中回復了confirm value。圖3-75 master發送con…

FRP配置( CentOS 7 上安裝 FRP教程 )

** 如果你們公司沒有公網IP&#xff0c;但是又想實現內網穿透&#xff0c;遠程調用接口&#xff0c;在家也能調用公司服務器&#xff0c;但是nkg ssl有問題&#xff0c;花生殼坑壁&#xff0c;那么FRP是你最佳的選擇&#xff01;&#xff01;&#xff01;** 不過有個前提&#…

第三次mysql作業

建立庫建立mydb11_syu庫2.創建s表&#xff0c;創建sc表二&#xff0e;插入數據向s表插入數據2.向sc表插入數據三&#xff0e;查詢1.分別查詢student表和score表的所有記錄2.查詢student表的第2條到5條記錄3.從student表中查詢計算機系和英語系的學生的信息4.從student表中查詢年…

不同場景下git指令的搭配

添加賬號 git config --global user.name "YourName" git config --global user.email "your_emailexample.com"設置 Git 默認分支名稱為 main&#xff1a; git config --global init.defaultBranch main初始化倉庫&#xff1a; git init配置SSH 密鑰 如果…

NLP——遷移學習

一、遷移學習的概念 1.預訓練模型(Pretrained model) 定義: 簡單來說別人訓練好的模型。一般預訓練模型具備復雜的網絡模型結構&#xff1b;一般是在大量的語料下訓練完成的。 2.微調(Fine-tuning) 定義:一般是對預訓練語言模型&#xff0c;進行垂直領域數據的微調&#xff0c;…

Ubuntu 安裝

文章目錄硬件準備下載 Ubuntu 鏡像創建可啟動 USB從 USB 驅動器啟動安裝 Ubuntu不要忘記更新&#xff01;用了十多年的筆記本&#xff0c;手邊正好有個500G的固態&#xff0c;準備換上。考慮到機器的硬件配置&#xff0c;現在使用windows10實在是有點卡&#xff0c;ubuntu卻剛好…

【46】MFC入門到精通——MFC顯示實時時間,獲取系統當前時間GetCurrentTime()、獲取本地時間GetLocalTime()

文章目錄1 MFC獲取時間方法方法一&#xff1a;獲取系統當前時間GetCurrentTime()方法二&#xff1a;獲取本地時間GetLocalTime()使用GetTickCount()獲取程序運行時間2 MFC顯示實時時間 使用方法2.1 獲取時間2.2 類向導 添加定時器函數 OnTimer2.3 初始化 設置定時器2.4 定時器函…

Linux717 SWAP擴容;邏輯卷條帶化

root192.168.235.20s password:┌────────────────────────────────────────────────────────────────────┐│ ? MobaXterm 20.0 ? ││ …

人類社會發展過程中的熵增定律

引子研究美國羅斯福新政期間的法案為什么會對美國經濟恢復起作用&#xff1f;與千金買馬骨和移木賞金之間的區別與聯系&#xff1f;以下為豆包 AI回答一、羅斯福新政法案對美國經濟起作用的原因羅斯福新政&#xff08;1933-1939年&#xff09;通過一系列政策應對大蕭條&#x…

Spring-AI系列-入門篇-核心概念、組件和生產要素

原文-Spring AI知識庫&#xff0c;歡迎大家評論互動 師父領進門&#xff0c;修行靠自己。 Spring AI is an application framework for AI engineering. Its goal is to apply to the AI domain Spring ecosystem design principles such as portability and modular design an…

從瀏覽器到服務器:TCP 段的網絡傳輸之旅

本文以簡化的網絡架構為例&#xff0c;詳細介紹了當你在瀏覽器中輸入網址&#xff08;例如www.google.com&#xff09;并按下回車鍵后&#xff0c;TCP段的完整傳輸過程。我們將探討DNS解析、ARP、TCP/IP封裝、PAT和路由如何協同工作&#xff0c;將數據從個人電腦通過局域網和廣…

HCIE - 云計算拿下后的職業選擇如何規劃?

Hello&#xff01;大家好&#xff0c;小編是一名專注 IT 領域的資深探索家。我們聊聊HCIE - 云計算&#xff0c;這個認證作為華為認證體系中云計算領域的專家級認證&#xff0c;標志著持有者具備企業級云架構設計、復雜云平臺運維及跨場景技術落地能力。但認證本身只是職業進階…