You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何执行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, "用户信息更新失败");
        }
    }
}

二、最佳执行位置

  1. 类级别静态声明Logger
    在每个需要日志的类中创建静态只读Logger实例,不要在方法内部重复初始化,减少性能开销。

  2. 构造函数注入(依赖注入场景)
    .NET Core/.NET 5+项目优先使用构造函数注入ILogger<T>,由DI容器统一管理生命周期,符合依赖倒置原则。

  3. 避免短生命周期对象中重复创建
    循环临时对象、单次请求的临时处理类等,不要每次创建新Logger,尽量复用或通过DI注入。

  4. 应用启动时初始化NLog
    在程序入口(如Program.cs、Main方法)完成NLog配置加载,确保日志服务在业务代码执行前就绪:

    // .NET Framework Main方法
    static void Main()
    {
        NLog.LogManager.LoadConfiguration("NLog.config");
        // 后续业务代码
    }
    

内容的提问来源于stack exchange,提问作者Matheo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 00:54:33