[英]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.