调用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
相关产品推荐
相关产品推荐

