在C#項(xiàng)目中使用NLog進(jìn)行日志記錄的方法步驟
一、整體流程(核心步驟)
使用 NLog 的核心流程可總結(jié)為:安裝 NuGet 包 → 配置 NLog.config → 代碼中初始化 / 使用 Logger → 驗(yàn)證日志輸出,下面分項(xiàng)目類型詳細(xì)說明。
二、控制臺(tái) / 桌面應(yīng)用(最基礎(chǔ)場景)
步驟 1:安裝 NLog 包
打開項(xiàng)目的 NuGet 包管理器,安裝核心包:
# .NET CLI 命令(推薦) dotnet add package NLog # 或 NuGet 包管理器控制臺(tái) Install-Package NLog
步驟 2:添加 NLog.config 配置文件
三、ASP.NETCore Web 應(yīng)用(主流場景)
- 在項(xiàng)目根目錄新建
NLog.config文件(右鍵文件 → 屬性 → 復(fù)制到輸出目錄 → 選擇「始終復(fù)制」); - 粘貼以下基礎(chǔ)配置(支持控制臺(tái) + 文件輸出,可直接復(fù)用):
<?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" <!-- 配置修改后自動(dòng)生效,無需重啟 -->
throwConfigExceptions="true"> <!-- 開發(fā)時(shí)開啟,配置錯(cuò)誤拋異常 -->
<!-- 變量定義:簡化重復(fù)配置 -->
<variable name="logDir" value="${basedir}/logs"/>
<variable name="logLayout" value="${longdate} | ${level:uppercase=true} | ${logger} | ${message} ${exception:format=ToString}"/>
<!-- 輸出目標(biāo):控制臺(tái) + 按天分割的文件 -->
<targets>
<!-- 控制臺(tái)輸出(開發(fā)調(diào)試) -->
<target name="console" xsi:type="Console" layout="${logLayout}"/>
<!-- 文件輸出(生產(chǎn)環(huán)境核心) -->
<target name="file" xsi:type="File"
fileName="${logDir}/${shortdate}.log" <!-- 日志路徑:項(xiàng)目目錄/logs/2025-12-25.log -->
archiveEvery="Day" <!-- 按天歸檔 -->
maxArchiveFiles="30" <!-- 保留30天日志 -->
encoding="UTF-8"
layout="${logLayout}"/>
</targets>
<!-- 日志規(guī)則:所有Info及以上級別輸出到控制臺(tái)+文件 -->
<rules>
<logger name="*" minlevel="Info" writeTo="console,file" />
</rules>
</nlog>步驟 1:C# 代碼中使用 NLog
using NLog;
namespace NLogDemo
{
class Program
{
// 核心:創(chuàng)建Logger(推薦每個(gè)類一個(gè),用當(dāng)前類名命名,便于定位日志來源)
private static readonly ILogger _logger = LogManager.GetCurrentClassLogger();
static void Main(string[] args)
{
try
{
// 1. 輸出不同級別的日志(按需選擇)
_logger.Info("程序啟動(dòng)成功,開始執(zhí)行業(yè)務(wù)邏輯");
_logger.Warn("注意:當(dāng)前內(nèi)存使用率超過80%");
// 模擬業(yè)務(wù)操作
var userId = 1001;
_logger.Info($"用戶 {userId} 發(fā)起查詢請求");
// 2. 模擬異常,記錄帶堆棧的錯(cuò)誤日志(核心場景)
throw new InvalidOperationException("數(shù)據(jù)庫查詢超時(shí)");
}
catch (Exception ex)
{
// 第一個(gè)參數(shù):異常對象(自動(dòng)記錄堆棧);第二個(gè)參數(shù):自定義日志消息
_logger.Error(ex, "執(zhí)行業(yè)務(wù)邏輯時(shí)發(fā)生錯(cuò)誤");
}
finally
{
// 釋放NLog資源(控制臺(tái)應(yīng)用結(jié)束時(shí)建議調(diào)用)
LogManager.Shutdown();
}
}
}
}步驟 2:驗(yàn)證效果
- 運(yùn)行程序,控制臺(tái)會(huì)輸出日志內(nèi)容;
- 查看項(xiàng)目輸出目錄(如
bin/Debug/net8.0/logs),會(huì)生成以當(dāng)天日期命名的.log文件,包含完整日志。
步驟 3:安裝適配包
dotnet add package NLog.Web.AspNetCore
步驟 4:配置 NLog.config
復(fù)用上面的 NLog.config 文件(無需修改,直接復(fù)制到項(xiàng)目根目錄,設(shè)置「始終復(fù)制」)。
步驟 5:Program.cs 中集成 NLog
using NLog; using NLog.Web; var builder = WebApplication.CreateBuilder(args); // 1. 清除.NET默認(rèn)日志提供器,啟用NLog builder.Logging.ClearProviders(); builder.Host.UseNLog(); // 注冊NLog到ASP.NET Core依賴注入 // 2. 添加MVC等服務(wù)(常規(guī)操作) builder.Services.AddControllersWithViews(); var app = builder.Build(); // 3. 中間件配置(常規(guī)操作) app.UseRouting(); app.UseEndpoints(endpoints => endpoints.MapControllers()); app.Run();
步驟 6:Controller/Service 中使用
通過依賴注入獲取 ILogger(ASP.NET Core 推薦方式):
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
namespace NLogWebDemo.Controllers
{
[ApiController]
[Route("api/[controller]")]
public class UserController : ControllerBase
{
// 注入ILogger(泛型參數(shù)為當(dāng)前類,便于日志定位)
private readonly ILogger<UserController> _logger;
public UserController(ILogger<UserController> logger)
{
_logger = logger;
}
[HttpGet("{id}")]
public IActionResult Get(int id)
{
// 記錄普通日志
_logger.LogInformation("接收到用戶查詢請求,ID:{UserId}", id);
try
{
// 模擬業(yè)務(wù)邏輯
if (id <= 0)
{
throw new ArgumentException("用戶ID不能為負(fù)數(shù)");
}
return Ok(new { Id = id, Name = "張三" });
}
catch (Exception ex)
{
// 記錄錯(cuò)誤日志
_logger.LogError(ex, "查詢用戶信息失敗,ID:{UserId}", id);
return BadRequest("查詢失敗");
}
}
}
}四、關(guān)鍵注意事項(xiàng)
- 配置文件屬性:務(wù)必將
NLog.config的「復(fù)制到輸出目錄」設(shè)為「始終復(fù)制」,否則程序運(yùn)行時(shí)找不到配置; - 日志級別控制:
Trace/Debug:開發(fā)環(huán)境調(diào)試用,生產(chǎn)環(huán)境建議關(guān)閉(配置中minlevel設(shè)為Info);Info/Warn:生產(chǎn)環(huán)境常規(guī)記錄;Error/Fatal:必須記錄,用于排查問題;
- 異常日志規(guī)范:記錄錯(cuò)誤時(shí)務(wù)必傳入
Exception對象,否則會(huì)丟失堆棧信息,無法定位問題; - 性能優(yōu)化:文件日志建議開啟
concurrentWrites="true"(多線程安全),keepFileOpen="false"(避免文件鎖定)。
總結(jié)
- 核心步驟:安裝包 → 配置
NLog.config(定義輸出目標(biāo) / 規(guī)則)→ 代碼中創(chuàng)建 / 注入ILogger→ 輸出不同級別日志(異常日志務(wù)必傳Exception對象); - 項(xiàng)目適配:控制臺(tái)應(yīng)用直接用
LogManager.GetCurrentClassLogger(),ASP.NET Core 需集成依賴注入并調(diào)用UseNLog(); - 關(guān)鍵規(guī)范:每個(gè)類對應(yīng)一個(gè) Logger(便于定位日志來源),異常日志必須包含堆棧信息,生產(chǎn)環(huán)境合理設(shè)置日志級別。
以上就是在C#項(xiàng)目中使用NLog進(jìn)行日志記錄的方法步驟的詳細(xì)內(nèi)容,更多關(guān)于C# NLog進(jìn)行日志記錄的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#檢測移動(dòng)硬盤并獲取移動(dòng)硬盤盤符的方法
這篇文章主要介紹了利用C#檢測移動(dòng)硬盤并獲取移動(dòng)硬盤盤符2017-12-12
C# AE之返回上一級和下一級的實(shí)戰(zhàn)操作
這篇文章主要介紹了C# AE之返回上一級和下一級的實(shí)戰(zhàn)操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01
C#筆記之EF Code First 數(shù)據(jù)模型 數(shù)據(jù)遷移
EF 中 Code First 的數(shù)據(jù)遷移網(wǎng)上有很多資料,我這份并沒什么特別。Code First 創(chuàng)建視圖網(wǎng)上也有很多資料,但好像很麻煩,而且親測好像是無效的方法(可能是我太笨,沒搞成功),我摸索出了一種簡單有效的方法,這里分享給大家2021-09-09
C#使用stackalloc分配堆棧內(nèi)存和非托管類型詳解
這篇文章主要為大家介紹了C#使用stackalloc分配堆棧內(nèi)存和非托管類型詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>2022-12-12
Unity3D實(shí)現(xiàn)飛機(jī)大戰(zhàn)游戲(2)
這篇文章主要為大家詳細(xì)介紹了Unity3D實(shí)現(xiàn)飛機(jī)大戰(zhàn)游戲的第二部分,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-06-06
基于C#的winform實(shí)現(xiàn)數(shù)字華容道游戲
這篇文章主要為大家詳細(xì)介紹了基于C#的winform實(shí)現(xiàn)數(shù)字華容道游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
關(guān)于C#中yield關(guān)鍵字的深入解析
這篇文章主要給大家介紹了關(guān)于C#中yield關(guān)鍵字的深入解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者使用C#具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11

