首页 > 解决方案 > .net core 2.2 从 Main 写入 NLog,但不从控制器写入

问题描述

我正在使用 NLog 编写一个 .net core 2.2 MVC 应用程序。从 Main 函数中,应用程序写入所有级别的 NLog,但从控制器中,没有写入任何内容。

appsettings.json 中的日志记录部分:

 "Logging": {
        "LogLevel": {
            "Default": "Trace",
            "Microsoft": "Information"
        }
    }

日志配置:

public static class NlogConfig
{
    public static LoggingConfiguration GetLoggingConfiguration()
    {
        var logConfig = new LoggingConfiguration();

        var consoleTarget = new ColoredConsoleTarget("consoleTarget")
        {
            Layout = @"${date:format=HH\:mm\:ss} ${level} ${message} ${exception}"
        };
        logConfig.AddTarget(consoleTarget);
        logConfig.AddRuleForAllLevels(consoleTarget);

        var fatalTarget = new FileTarget("fatal")
        {
            FileName = "${basedir}/logs/${shortdate}/fatal-${shortdate}.log",
            Layout = "${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}"
        };
        logConfig.AddTarget(fatalTarget);
        logConfig.AddRuleForOneLevel(LogLevel.Fatal, fatalTarget);

        var errorTarget = new FileTarget("error")
        {
            FileName = "${basedir}/logs/${shortdate}/error-${shortdate}.log",
            Layout = "${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}"
        };
        logConfig.AddTarget(errorTarget);
        logConfig.AddRuleForOneLevel(LogLevel.Error, errorTarget);

        var warningTarget = new FileTarget("warning")
        {
            FileName = "${basedir}/logs/${shortdate}/warning-${shortdate}.log",
            Layout = "${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}"
        };
        logConfig.AddTarget(warningTarget);
        logConfig.AddRuleForOneLevel(LogLevel.Warn, warningTarget);

        var infoTarget = new FileTarget("info")
        {
            FileName = "${basedir}/logs/${shortdate}/info-${shortdate}.log",
            Layout = "${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}"
        };
        logConfig.AddTarget(infoTarget);
        logConfig.AddRuleForOneLevel(LogLevel.Info, infoTarget);

        var debugTarget = new FileTarget("debug")
        {
            FileName = "${basedir}/logs/${shortdate}/debug-${shortdate}.log",
            Layout = "${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}"
        };
        logConfig.AddTarget(debugTarget);
        logConfig.AddRuleForOneLevel(LogLevel.Debug, debugTarget);

        var traceTarget = new FileTarget("trace")
        {
            FileName = "${basedir}/logs/${shortdate}/trace-${shortdate}.log",
            Layout = "${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}"
        };
        logConfig.AddTarget(traceTarget);
        logConfig.AddRuleForOneLevel(LogLevel.Trace, traceTarget);

        var allTarget = new FileTarget("all")
        {
            FileName = "${basedir}/logs/${shortdate}/all-${shortdate}.log",
            Layout = "${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}"
        };
        logConfig.AddTarget(allTarget);
        logConfig.AddRuleForAllLevels(allTarget);

        return logConfig;
    }

我的主要功能: public static void Main(string[] args) {

        // NLog: setup the logger first to catch all errors
        var logConfig = NlogConfig.GetLoggingConfiguration();
        var logger = NLog.Web.NLogBuilder.ConfigureNLog(logConfig).GetCurrentClassLogger();
        try
        {
            logger.Debug("init main");
            logger.Trace("startup - trace logging test");
            logger.Info("startup - info logging test");
            logger.Warn("startup - warn logging test");
            logger.Error("startup - error logging test");
            logger.Fatal("startup - fatal logging test");

            CreateWebHostBuilder(args).Build().Run();
        }
        catch (Exception ex)
        {
            logger.Fatal(ex, "Stopped program because of exception");
            throw;
        }
        finally
        {
            // Ensure to flush and stop internal timers/threads before application-exit (Avoid segmentation fault on Linux)
            NLog.LogManager.Shutdown();
        }
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
        .ConfigureLogging(logging =>
        {
            logging.ClearProviders();
            logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
        }).UseNLog(); // NLog: setup NLog for Dependency injection
}

和一个示例控制器:

[ApiController]
[Route("/api/app/parts")]
public class AppPartsController : ControllerBase
{
    private readonly ILogger<AppPartsController> _logger;
    private IPartsRepository _partsRepo;

    public AppPartsController(ILogger<AppPartsController> logger, IPartsRepository repo)
    {
        _logger = logger;
        _partsRepo = repo;
    }


    [HttpGet]
    public async Task<ActionResult> Get()
    {
        _logger.LogInformation("/api/app/parts has been reached");
        try
        {
            var partsDb = await _partsRepo.GetAllParts();
            var parts = Mapper.Map<IEnumerable<AppPartDto>>(partsDb);
            return Ok(parts);
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "error in AppPartsController, get all parts ");
            return StatusCode(500);
        }
    }
}

无论我做什么,“主要”中的所有日志条目都已写入,但控制器条目未写入。

afaik,NLog 是按照他们的说明配置的,但显然我在这里遗漏了一些东西......

谢谢,

尼尔

标签: .net-corenlog

解决方案


好吧,配置混乱。

当我更深入地查看调试文件夹时,我突然发现日志文件是在不应该生成的地方生成的,并且在我的 NLog 代码配置中使用了不同的命名约定。

这导致我在广泛的文件中寻找 rouge 配置文件 - 随后发现潜伏在项目文件夹中,从项目中删除后,但没有从文件系统中删除。

然后我继续在我的代码中搜索所述配置文件的用法,并在我的所有存储库中找到它们。

将存储库转换为使用正确的代码配置后,一切都已修复,并且恢复了和平与秩序。

我还更新了 appsettings.json 中的日志记录部分,使其看起来像这样(但我不确定它是否有任何影响):

 "Logging": {
        "LogLevel": {
            "Default": "Trace",
            "Microsoft": "Trace"
        }
    }

推荐阅读