簡體   English   中英

如何在運行時更改NLog目標的連接字符串?

[英]How to change NLog target's connection string at runtime?

在我的WebAPI應用程序中,我試圖根據我的自定義標頭值登錄到Application_BeginRequest的幾個單獨的數據庫。

為此,我嘗試像這樣修改Nlog.config target

<target name="database" 
        xsi:type="Database" 
        connectionString="${gdc:item=myConnectionstring}" 
        commandText="..sql command..">..params..</target>

Application_BeginRequest我嘗試將myConnectionstring設置如下:

GlobalDiagnosticsContext.Set("myConnectionString", connectionString);

但這不起作用,並且在NLog的internalLogFile錯誤中顯示:

2015-02-19 12:12:48.8776 Error Error when writing to database System.InvalidOperationException: The ConnectionString property has not been initialized.
   at System.Data.SqlClient.SqlConnection.PermissionDemand()
   at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
   at System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1 retry)
   at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
   at System.Data.SqlClient.SqlConnection.Open()
   at NLog.Targets.DatabaseTarget.OpenConnection(String connectionString)
   at NLog.Targets.DatabaseTarget.WriteEventToDatabase(LogEventInfo logEvent)
   at NLog.Targets.DatabaseTarget.Write(LogEventInfo logEvent)

我嘗試將以下參數寫入db(使用恆定連接字符串配置):

<parameter name="@cn" layout="${gdc:myConnectionstring}"/>
<parameter name="@cn1" layout="${gdc:item=myConnectionstring}"/>

但是它們似乎是空的,但是,當我調試WebApi Action引發我期望寫在數據庫中的錯誤時, GlobalDiagnosticsContext.Get("myConnectionString")返回期望值。

我做錯了什么? 為什么我可以在GlobalDiagnosticsContext.Get("myConnectionString")看到期望值,但是${gdc:item=myConnectionstring}解析為空字符串?

找到了另一種方法來實現這一目標:

var databaseTarget = (DatabaseTarget)LogManager.Configuration.FindTargetByName("database");
databaseTarget.ConnectionString = connectionString;
LogManager.ReconfigExistingLoggers();

但是仍然不清楚為什么GlobalDiagnosticsContext東西不起作用。

感謝您的解決方案!

不過,如果要使用異步數據庫目標,則需要首先獲取包裝目標:

DatabaseTarget databaseTarget;
var target = LogManager.Configuration.FindTargetByName("database");
if (target is AsyncTargetWrapper)
    databaseTarget = (target as AsyncTargetWrapper).WrappedTarget as DatabaseTarget;
else
    databaseTarget = target as DatabaseTarget;
if (databaseTarget == null)
    throw new NullReferenceException("Can't find DatabaseTarget with name 'database'");

databaseTarget.ConnectionString = connectionStringSelected.ConnectionString;
LogManager.ReconfigExistingLoggers();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM