.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
相关产品推荐
相关产品推荐

