[英]Log4Net: Using the C# AdoNetAppender with a custom Xml layout
[英]Using different ConnectionString in a Custom AdoNetAppender with log4net
我想使用將在運行時定義的ConnectionString。 我找到了很多例子,但是我無法使其工作。
我創建了一個自定義AdoNetAppender:
public class AdoNetMultiTenantAppender : AdoNetAppender
{
public new string ConnectionString
{
get
{
return base.ConnectionString;
}
set
{
base.ConnectionString = Tenant.Current.DataSource.ConnectionString; // Return the connection string
}
}
}
我有以下配置:
<appender name="AdoNetMultiTenantAppender" type="MyNameSpace.AdoNetMultiTenantAppender">
<bufferSize value="1" />
<connectionstring value="" />
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<commandText value="[...]" />
<parameter>
[...]
</parameter>
</appender>
我的記錄器在配置文件中的定義如下:
<logger name="ProcessLogger" additivity="false">
<level value="INFO"/>
<appender-ref ref="AdoNetMultiTenantAppender"/>
</logger>
最后,要使我的Logger進入我的代碼,我正在做:
[...]
private static readonly ILog Logger = LogManager.GetLogger("ProcessLogger");
[...]
ProcessLogger.Logger.Info(message);
[...]
當我嘗試將“連接”字符串“硬編碼”到我的配置中時,它正在工作。 但是我不能這樣做,因為我需要根據某些變量使用不同的ConnectionString。 我放在自定義附加程序中的屬性ConnectionString永不調用。 你知道我在想什么嗎?
您正在使用哪個版本的log4net?
無論如何,都不會從現有基礎結構中自動調用派生類中的new
ConnectionString屬性。
通過覆蓋適當的虛擬成員,您可能會獲得更大的成功:例如,如果您使用的是log4net 1.2.11,則可以覆蓋CreateConnection
或ResolveConnectionString
方法。
更新后立即發表評論:
但是CreateConnection僅使用一次,因此我不能對多個ConnectionString使用相同的附加程序
是的,log4net AdoNetAppender
具有不尋常的設計,其中連接對象保持打開狀態,並且可用於每個日志記錄請求。 與通常建議的方法形成對比,后者是盡可能晚地創建/打開數據庫連接,並在使用后立即將其關閉。 推薦的方法允許應用程序利用ADO.NET的內置連接池。
您可以嘗試做的一件事是重寫SendBuffer(LoggingEvent[] events)
,然后在您的重寫調用基類中關閉連接。 每次調用SendBuffer
這將強制重新打開連接。
我不確定這是否會給您所需的一切-您談到使用多個連接字符串的Multitenant應用程序。 在這種情況下,傳遞給SendBuffer
的LoggingEvent
數組可能包含應發送到不同連接的事件。 也許您需要使用LoggingEvent
某些屬性按目標連接拆分輸入數組,然后對於每個目標連接,打開連接,調用base.SendBuffer
然后關閉連接。
這將在現有的AdoNetAppender上運行:
public static void SetConnectionString(string connectionString)
{
Hierarchy logHierarchy = log4net.LogManager.GetRepository() as Hierarchy;
if (logHierarchy == null)
{
throw new InvalidOperationException("Can't set connection string as hierarchy is null. Has logging been initialised?");
}
// Assumes there is only one appender to be configured
var appender = logHierarchy.GetAppenders().OfType<AdoNetAppender>().SingleOrDefault();
if (appender == null)
{
throw new InvalidOperationException("Can't set connection string as can't locate a database appender");
}
appender.ConnectionString = connectionString;
appender.ActivateOptions();
}
請注意,AdoNetAppender將在配置中抱怨未設置連接字符串值,但這並不重要,除非您打開所有異常,否則您可能不會注意到。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.