如何执行nLog日志记录器?最佳实现位置是什么?
NLog日志记录器执行方法与最佳实践
你的NLog File Target配置代码如下:
<target xsi:type="File" name="AAAAA" filename="${basedir}\..\AAAAA\AAAAA${shortdate}.csv"> <layout xsi:type="CsvLayout" delimiter="Semicolon" withHeader="True" quoting="Auto"> <column name="Date" layout="${longdate}" /> <column name="Thread" layout="${threadid} (${threadname})" /> <column name="Level" layout="${level}" /> <column name="Logger" layout="${logger:shortName=False}" /> <column name="NDC" layout="${ndlc:separator=, }" /> <column name="Message" layout="${message}" /> </layout> </target>
一、如何执行这个日志记录器
1. 补全NLog配置文件
你当前仅定义了日志输出目标(Target),还需要添加**路由规则(Rules)**将日志导向这个Target。完整的NLog.config示例:
<?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"> <!-- 你的Target配置 --> <targets> <target xsi:type="File" name="AAAAA" filename="${basedir}\..\AAAAA\AAAAA${shortdate}.csv"> <layout xsi:type="CsvLayout" delimiter="Semicolon" withHeader="True" quoting="Auto"> <column name="Date" layout="${longdate}" /> <column name="Thread" layout="${threadid} (${threadname})" /> <column name="Level" layout="${level}" /> <column name="Logger" layout="${logger:shortName=False}" /> <column name="NDC" layout="${ndlc:separator=, }" /> <column name="Message" layout="${message}" /> </layout> </target> </targets> <!-- 添加路由规则:将所有级别>=Debug的日志输出到AAAAA Target --> <rules> <logger name="*" minlevel="Debug" writeTo="AAAAA" /> </rules> </nlog>
2. 安装NLog依赖
根据项目类型安装对应包:
- .NET Core/.NET 5+ Web项目:NuGet安装
NLog.Web.AspNetCore - .NET Core控制台/.NET Framework:NuGet安装
NLog和NLog.Config
3. 在代码中调用日志记录器
方式1:依赖注入(推荐.NET Core/.NET 5+)
在应用启动类中配置NLog服务:
// .NET 6+ Program.cs var builder = WebApplication.CreateBuilder(args); // 清空默认日志提供器,启用NLog builder.Logging.ClearProviders(); builder.Logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace); builder.Host.UseNLog(); var app = builder.Build();
然后在业务类中通过构造函数注入ILogger<T>:
public class OrderService { private readonly ILogger<OrderService> _logger; public OrderService(ILogger<OrderService> logger) { _logger = logger; } public void CreateOrder() { _logger.LogInformation("创建订单操作执行"); // 使用NDC嵌套上下文 using (NLog.MappedDiagnosticsLogicalContext.SetScoped("OrderId", "12345")) { _logger.LogDebug("订单ID已加入上下文"); } } }
方式2:直接获取Logger实例(传统项目)
在类中声明静态只读Logger,避免重复创建:
public class UserHelper { private static readonly NLog.Logger _logger = NLog.LogManager.GetCurrentClassLogger(); public void UpdateUserInfo() { try { // 业务逻辑 _logger.Info("用户信息更新成功"); } catch (Exception ex) { _logger.Error(ex, "用户信息更新失败"); } } }
二、最佳执行位置
类级别静态声明Logger
在每个需要日志的类中创建静态只读Logger实例,不要在方法内部重复初始化,减少性能开销。构造函数注入(依赖注入场景)
.NET Core/.NET 5+项目优先使用构造函数注入ILogger<T>,由DI容器统一管理生命周期,符合依赖倒置原则。避免短生命周期对象中重复创建
循环临时对象、单次请求的临时处理类等,不要每次创建新Logger,尽量复用或通过DI注入。应用启动时初始化NLog
在程序入口(如Program.cs、Main方法)完成NLog配置加载,确保日志服务在业务代码执行前就绪:// .NET Framework Main方法 static void Main() { NLog.LogManager.LoadConfiguration("NLog.config"); // 后续业务代码 }
内容的提问来源于stack exchange,提问作者Matheo
相关产品推荐
相关产品推荐

