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

.NET Core 2.0 MSTest项目迁移后NLog无法写入日志的问题

解决.NET Core 2.0 MSTest项目中NLog无法写入日志的问题

你已经完成了项目迁移的基础工作,但在.NET Core环境下,MSTest项目确实需要额外配置才能让NLog正常工作——毕竟.NET Core的日志体系和.NET Framework差异很大,不会自动识别并加载NLog配置。下面是具体的解决步骤:

1. 确保NLog配置文件被复制到输出目录

首先检查你的nlog.config文件属性:在Visual Studio中右键该文件,选择属性,将复制到输出目录设置为如果较新则复制(或始终复制)。如果配置文件没出现在测试项目的输出目录里,NLog根本找不到它,自然无法生成日志。

2. 集成NLog到.NET Core日志系统(依赖注入方式)

因为你已经引用了Microsoft.Extensions.DependencyInjection和NLog.Extensions.Logging,推荐通过依赖注入来配置日志。你可以在测试类的初始化方法里搭建服务容器并添加NLog:

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using NLog.Extensions.Logging;
using Microsoft.VisualStudio.TestTools.UnitTesting;

[TestClass]
public class YourTestClass
{
    private ILogger<YourTestClass> _logger;
    private IServiceProvider _serviceProvider;

    [TestInitialize]
    public void TestSetup()
    {
        // 构建服务容器
        var services = new ServiceCollection();
        
        // 配置日志:清除默认提供器,添加NLog
        services.AddLogging(loggingBuilder =>
        {
            loggingBuilder.ClearProviders(); // 移除默认的Console/ Debug日志提供器
            loggingBuilder.SetMinimumLevel(LogLevel.Trace); // 匹配NLog的最低级别
            loggingBuilder.AddNLog(); // 集成NLog
        });

        // 如果你的类库需要依赖注入,在这里注册服务
        // services.AddScoped<YourLibraryService>();

        _serviceProvider = services.BuildServiceProvider();
        // 获取日志实例
        _logger = _serviceProvider.GetRequiredService<ILogger<YourTestClass>>();
    }

    [TestCleanup]
    public void TestTeardown()
    {
        // 关闭NLog,释放资源
        NLog.LogManager.Shutdown();
    }

    [TestMethod]
    public void TestLogging()
    {
        // 使用日志
        _logger.LogInformation("测试日志信息");
        _logger.LogTrace("测试Trace日志");
    }
}

3. 如果你直接使用NLog的LogManager(非DI方式)

如果你的代码里是直接通过NLog.LogManager.GetLogger("MyLogger")获取日志实例,那需要手动加载NLog配置:

[TestInitialize]
public void TestSetup()
{
    // 手动加载nlog.config配置文件
    var config = new NLog.Config.XmlLoggingConfiguration("nlog.config");
    NLog.LogManager.Configuration = config;
}

4. 验证日志路径和权限

另外,注意${basedir}在MSTest中的指向:它通常是测试项目的输出目录(比如bin/Debug/netcoreapp2.0)或者测试运行主机的临时目录。你可以临时修改nlog.config里的fileName为绝对路径(比如c:/temp/logs/MyLogs.json)测试是否能生成日志,排除路径权限问题。也可以在代码里打印当前目录确认:

var currentDir = System.AppContext.BaseDirectory;
Console.WriteLine($"当前运行目录:{currentDir}");

完成这些配置后,重新运行测试,NLog应该就能正常生成日志文件了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:05:27