Nlog 从 Appsettings 获取 Azure Blob Storage 连接字符串

Nlog get Azure Blob Storage connection string from Appsettings

我正在 Azure 中创建我的第一个 .Net Core 网站,我正在使用 NLog 和 blob 存储。我已经开始工作了,但是连接字符串现在硬编码在 NLog.config 文件中。我想将连接字符串移动到 appsettings.json 文件中,以便我可以根据我在 CI/CD 管道中将其发布到的位置为任一 Dev/Stage 环境更改它。我发现以下文章使用 Azure Key Vault 作为连接字符串,最终我们将开始使用 Key Vault,但我们还没有到那个时候。我需要使用的函数是文章中的 UpdateNLogConfig,我将从 appsettings.json 中拉出连接,然后将其设置为 GDC,然后我将从 NLog.config 文件中检索它。我不确定 when/where 我是否调用 UpdateNLogConfig。

https://www.taithienbo.com/securely-log-to-blob-storage-using-nlog-with-connection-string-in-key-vault/

这是我目前 Program.cs 中的内容。我知道我也需要在此处添加 UpdateNLogConfig()

public class Program
    {
        public static void Main(string[] args)
        {
            //var logger = NLog.Web.NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();
            try
            {
                CreateHostBuilder(args).Build().Run();
            }
            catch (Exception exception)
            {
                //logger.Error(exception, "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 IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
              .ConfigureWebHostDefaults(webBuilder =>
              {
                  webBuilder.UseStartup<Startup>();
              })
              .ConfigureLogging(logging =>
              {
                  logging.ClearProviders();
                  logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
              })
              .UseNLog();  
    }

更新:

我正在努力转换为在 appsettings.json 中设置 NLog 配置,而不是使用 NLog.config 文件。我遵循了建议的主题并提出了以下建议。它将写入 internal-nlog.txt 文件,但我无法创建或写入我的 LocalTarget。我觉得必须安装和配置它,因为它正在写入内部-nlog.txt,但我看不出是什么导致它不写入我的 LocalTarget。

Program.cs

 public class Program
    {
        public static void Main(string[] args)
        {
            var config = new ConfigurationBuilder()
              .SetBasePath(System.IO.Directory.GetCurrentDirectory())
              .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true).Build();
            NLog.Config.LoggingConfiguration nlogConfig = new NLogLoggingConfiguration(config.GetSection("NLog"));

            var logger = NLog.Web.NLogBuilder.ConfigureNLog(LogManager.Configuration).GetCurrentClassLogger();
            try
            {
                logger.Debug("Initialize main");

                CreateHostBuilder(args).Build().Run();
            }
            catch (Exception ex)
            {
                logger.Error(ex, "Stopped program because of exception.");
                //throw;
            }
            finally
            {
                NLog.LogManager.Shutdown();
            }
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
              .ConfigureWebHostDefaults(webBuilder =>
              {
                  webBuilder.UseStartup<Startup>();
              })
              .ConfigureLogging(logging =>
              {
                  logging.ClearProviders();
                  logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
              })
              .UseNLog();  // NLog: Setup NLog for Dependency injection
    }

appsettings.json

  "NLog": {
    "internalLogLevel": "Info",
    "internalLogFile": "c:\temp\NLog\internal-nlog.txt",
    "extensions": {
      "NLog.Web.AspNetCore": {
        "assembly": "NLog.Web.AspNetCore"
      }
    },
    "targets": {
      "LocalTarget": {
        "type": "File",
        "fileName": "c:\temp\NLog\PayDocs_${shortdate}.log",
        "layout": "${longdate} | ${uppercase:${level}} | ${callsite} | ${message}"
    },
    "rules": [
      {
        "logger": "*",
        "minLevel": "Trace",
        "writeTo": "LocalTarget"
      },
      {
        "logger": "Microsoft.*",
        "maxLevel": "Info",
        "final": "true"
      }
    ]
  }

UpdateNLogConfig只是加载nlog配置,而且是自定义方法

您可以通过以下代码从 appsettings.json 加载您的配置。

var config = new ConfigurationBuilder()
                .SetBasePath(System.IO.Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true).Build();
NLog.Config.LoggingConfiguration nlogConfig = new NLogLoggingConfiguration(config.GetSection("NLog"));

*更多详情可参考下方相关post。 *