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

.NET Core 3.1中如何用Azure KeyVault连接串配置NLog写入数据库

解决NLog引用Azure KeyVault中连接串的问题

你已经在Program.cs中实现了从Azure KeyVault加载配置,以下两种方法可以让NLog引用KeyVault中的连接串:

方法一:直接通过${configsetting}读取KeyVault连接串

因为你已经将Azure KeyVault的秘密加载到了应用全局配置中,只需修改NLog配置里的connectionString,让它读取KeyVault中对应的秘密名称即可。

假设你在KeyVault中存储的连接串密钥名为databaseConnectionString(和Program.cs中读取的键一致),修改NLog配置的数据库目标部分:

<target xsi:type="Database"
  name="dbTarget"
  connectionString="${configsetting:item=databaseConnectionString}"
  commandText="INSERT INTO Logs(CreatedOn,Message,Level,Exception,StackTrace,Logger,Url) VALUES (@datetime,@msg,@level,@exception,@trace,@logger,@url)">
  <parameter name="@datetime" layout="${date}" />
  <parameter name="@msg" layout="${message}" />
  <parameter name="@level" layout="${level}" />
  <parameter name="@exception" layout="${exception:format=@}" />
  <parameter name="@trace" layout="${stacktrace}" />
  <parameter name="@logger" layout="${logger}" />
  <parameter name="@url" layout="${aspnet-request-url}" />
</target>

你的NLog配置已经引用了NLog.Appsettings.Standard扩展,这个扩展会自动从应用全局配置(包括KeyVault加载的内容)中读取配置项,无需额外修改代码。

方法二:在代码中手动配置NLog连接串

如果需要更灵活的控制(比如动态修改、避免在配置文件中暴露密钥名),可以在Program.cs中手动给NLog的数据库目标设置连接串:

修改Program.cs的CreateHostBuilder方法

添加UseNLog配置,在其中获取KeyVault的连接串并赋值给NLog目标:

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration((context, config) =>
        {
            string MyClientID = "1MyClientID";
            string MyTenantID = "1MyTenantID";
            string MyClientSecretID = "1MyClientSecretID";

            ClientSecretCredential credential =
            new ClientSecretCredential(MyTenantID, MyClientID, MyClientSecretID);

            var secretClient = new SecretClient(new Uri("https://somerandomurivault.vault.azure.net/"),
                credential);
            config.AddAzureKeyVault(secretClient, new KeyVaultSecretManager());
        })
        .ConfigureServices((hostContext, services)=>
        {
            var databaseConnectionString = hostContext.Configuration.GetValue<string>("databaseConnectionString");
            services.AddDbContext<AppDbContext>(options =>
            {
                options.UseSqlServer(databaseConnectionString);
            });
        })
        .ConfigureLogging(logging =>
        {
            logging.ClearProviders();
            logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
        })
        .UseNLog((context, options) =>
        {
            // 从全局配置中获取KeyVault里的连接串
            var connectionString = context.Configuration.GetValue<string>("databaseConnectionString");
            // 找到NLog中名为dbTarget的数据库目标
            var dbTarget = options.Configuration.FindTargetByName<DatabaseTarget>("dbTarget");
            if (dbTarget != null)
            {
                // 给目标设置连接串
                dbTarget.ConnectionString = connectionString;
            }
        })
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        });

修改NLog配置的数据库目标

将connectionString设为空或占位符即可:

<target xsi:type="Database"
  name="dbTarget"
  connectionString=""
  commandText="INSERT INTO Logs(CreatedOn,Message,Level,Exception,StackTrace,Logger,Url) VALUES (@datetime,@msg,@level,@exception,@trace,@logger,@url)">
  <!-- 参数部分保持不变 -->
</target>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 22:20:29