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

调用services.AddLogging()是否会导致NLog无法运行?.NET Core 2.0日志问题

解决.NET Core 2.0中NLog无日志输出的问题

嘿,我看你遇到了.NET Core 2.0里NLog不输出日志的麻烦,咱们一步步来搞定它!从你贴的代码片段来看,核心问题是你只注册了基础的日志抽象服务,但没把NLog真正集成到.NET Core的日志系统里。下面是具体的修复方案和完整示例:

1. 先装对NuGet包

首先得确保你安装了适配.NET Core 2.0的NLog包,别装错版本哦。打开NuGet控制台(或者用.NET CLI)执行:

Install-Package NLog.Web.AspNetCore -Version 4.9.3
# 或者用.NET CLI命令
dotnet add package NLog.Web.AspNetCore --version 4.9.3

(注:.NET Core 2.0对应的NLog.Web.AspNetCore建议用4.x系列,高版本可能不兼容)

2. 修改BuildDi方法,把NLog接入日志系统

你的现有代码只是注册了LoggerFactory和Logger<>,但没让LoggerFactory使用NLog作为日志提供器。修改后的代码如下:

private static IServiceProvider BuildDi()
{
    var services = new ServiceCollection();
    services.AddTransient<Runner>();

    // 第一步:初始化NLog,加载配置文件
    var loggerFactory = new LoggerFactory();
    loggerFactory.AddNLog(); // 关键一步:把NLog添加到日志工厂里
    NLog.LogManager.LoadConfiguration("nlog.config"); // 加载NLog的配置文件

    // 注册日志相关服务到DI容器
    services.AddSingleton<ILoggerFactory>(loggerFactory);
    services.AddSingleton(typeof(ILogger<>), typeof(Logger<>));

    // 配置日志级别(保留你原来的设置就行)
    services.AddLogging(builder => 
    {
        builder.SetMinimumLevel(LogLevel.Trace);
        builder.AddNLog(); // 也可以在这里通过AddNLog添加,效果一样
    });

    var serviceProvider = services.BuildServiceProvider();
    return serviceProvider;
}

3. 确保nlog.config配置正确且能被加载

在项目根目录创建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"
      autoReload="true"
      internalLogLevel="Info"
      internalLogFile="internal-nlog.txt">

  <!-- 日志输出目标:控制台+文件 -->
  <targets>
    <target name="console" xsi:type="Console" />
    <target name="file" xsi:type="File" fileName="logs/${shortdate}.log" 
            layout="${longdate} ${level} ${message} ${exception:format=tostring}" />
  </targets>

  <!-- 日志规则:所有命名空间的日志,Trace及以上级别都输出到控制台和文件 -->
  <rules>
    <logger name="*" minlevel="Trace" writeTo="console,file" />
  </rules>
</nlog>

4. 确保Runner类正确注入并使用日志

最后,你的Runner类要正确依赖注入ILogger,比如:

public class Runner
{
    private readonly ILogger<Runner> _logger;

    // 通过构造函数注入日志
    public Runner(ILogger<Runner> logger)
    {
        _logger = logger;
    }

    public void Run()
    {
        // 测试不同级别的日志
        _logger.Trace("这是Trace级别的日志");
        _logger.Debug("这是Debug级别的日志");
        _logger.Info("这是Info级别的日志");
        _logger.Warn("这是Warn级别的日志");
        _logger.Error("这是Error级别的日志");
        _logger.Fatal("这是Fatal级别的日志");
    }
}

几个快速排查点

  • 检查nlog.config是否真的被复制到了输出目录(bin/Debug/netcoreapp2.0下),找不到配置的话NLog会静默失败
  • 查看NLog的内部日志文件internal-nlog.txt,里面会记录NLog初始化时的错误,比如配置文件语法错误、权限问题等
  • 确保日志级别匹配:你代码里设置了SetMinimumLevel(LogLevel.Trace),NLog配置里的minlevel也要至少是Trace,不然日志会被过滤掉
  • 确认NLog.Web.AspNetCore包已经正确安装,AddNLog()方法是这个包提供的,没装的话会找不到方法

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:17:46