???????
目錄
1.添加包
2.新建公用類
3.新建配置
4.注冊
? ? ? ? 4.1.類庫項目設置
5.使用
?????????在 .NET Core 項目中使用 Log4Net 做日志記錄,具有很多優勢。盡管 .NET Core 自帶了 ILogger
接口(如使用內置的 ConsoleLogger
、DebugLogger
等),但 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;}}
}
? ? ? ? 案例如下