c# - .NET5辅助服务模板的NLog设置

标签 c# .net .net-5 nlog

我现在正在尝试让 NLog 在 .NET5 辅助服务模板中工作一段时间。但无论我尝试什么,都没有日志。不幸的是,网站、github 或谷歌都没有给我带来任何线索。

我使用

  • .NET5 辅助服务模板
  • NLog.Extensions.Logging 版本 1.7.4

只是为了确保,日志文件的目标目录是预先创建的。

使用的appsettings.json:

{
  "NLog": {
    "throwConfigExceptions": true,
    "targets": {
      "async": true,
      "logfile": {
        "type": "File",
        "fileName": "c:/temp/nlog/nlog-${shortdate}.log"
      },
      "logconsole": {
        "type": "Console"
      }
    },
    "rules": [
      {
        "logger": "*",
        "minLevel": "Info",
        "writeTo": "logconsole"
      },
      {
        "logger": "*",
        "minLevel": "Debug",
        "writeTo": "logfile"
      }
    ]
  },

  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  }
}

设置的完整代码(仍然是基本模板),但必须缺少一些内容:

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using NLog.Extensions.Logging;
using System;
using System.Threading;
using System.Threading.Tasks;

namespace NLogSample
{

    public class Worker : BackgroundService
    {
        private readonly ILogger<Worker> _logger;

        public Worker(ILogger<Worker> logger)
        {
            _logger = logger;
        }

        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            while (!stoppingToken.IsCancellationRequested)
            {
                _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
                await Task.Delay(1000, stoppingToken);
            }
        }
    }

    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureLogging((hostContext, logging) => 
                {
                    // ensure just use NLog
                    logging.Services.Clear(); 
                    logging.SetMinimumLevel(LogLevel.Trace);
 
                    //logging.AddNLog(hostContext.Configuration);
                    logging.AddNLog(hostContext.Configuration.GetSection("NLog"));
                })
                .ConfigureServices((hostContext, services) =>
                {
                    services.AddHostedService<Worker>();
                })
                //.UseNLog()
                ;
    }
}

最佳答案

尝试指定 LoggingConfigurationSectionName = "NLog" 并将 logging.Services.Clear() 替换为 logging.ClearProviders()。像这样:

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureLogging((hostContext, logging) => 
        {
            // ensure just use NLog
            logging.ClearProviders();
            logging.SetMinimumLevel(LogLevel.Trace);
            logging.AddNLog(hostContext.Configuration, new NLogProviderOptions() { LoggingConfigurationSectionName = "NLog" });
        })
        .ConfigureServices((hostContext, services) =>
        {
            services.AddHostedService<Worker>();
        });

另请参阅:https://stackoverflow.com/a/67780779/193178

关于c# - .NET5辅助服务模板的NLog设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69594537/

相关文章:

c# - 使用 C# 读取 PuTTY 输出

javascript - 在每个字符输入后使密码文本框值可见

c# - 动态 PDF 或 Word 文档生成的最佳库?

c# - mysql中的存储MapPaths(使用c#)

c# - 如何添加源生成器作为 nuget 引用?

c# - System.Text.Json 未序列化 List<T>

c# - 如何导入HL7以获得血液结果并解析以进行患者报告?

c# - 单击按钮时如何将数据从 editText.text 传递到 Xamarin Android 中的另一个 Activity

c# - 当控件来自 DataTemplate 时,BindingOperations.ClearBinding(...) 不起作用

c# - 有没有办法在 Actions 中选择 Newtonsoft.json 和 System.Text.Json?