簡體   English   中英

在帶有log4net的自定義AdoNetAppender中使用其他ConnectionString

[英]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,則可以覆蓋CreateConnectionResolveConnectionString方法。

更新后立即發表評論:

但是CreateConnection僅使用一次,因此我不能對多個ConnectionString使用相同的附加程序

是的,log4net AdoNetAppender具有不尋常的設計,其中連接對象保持打開狀態,並且可用於每個日志記錄請求。 與通常建議的方法形成對比,后者是盡可能晚地創建/打開數據庫連接,並在使用后立即將其關閉。 推薦的方法允許應用程序利用ADO.NET的內置連接池。

您可以嘗試做的一件事是重寫SendBuffer(LoggingEvent[] events) ,然后在您的重寫調用基類中關閉連接。 每次調用SendBuffer這將強制重新打開連接。

我不確定這是否會給您所需的一切-您談到使用多個連接字符串的Multitenant應用程序。 在這種情況下,傳遞給SendBufferLoggingEvent數組可能包含應發送到不同連接的事件。 也許您需要使用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.

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