web-dev-qa-db-ja.com

構成する代わりに、現在のWebサイトのconnectionStringをlog4Netに使用する方法

システムのログにlog4Netを使用しています。アペンダータイプがLog4NetのAdoNetAppenderである場合、connectionStringノードは必須です。ただし、Log4Netを使用するWebサイトにはすでにconnectionStringがあります。

Log4net構成ファイルで同じconnstrを再度構成する代わりに、log4NetのWebサイトのconnStrを使用するにはどうすればよいですか?

29
Aiping He

非常に簡単です。アペンダーconnectionString構成を置き換えるだけです。

接続文字列の代わりに:

<connectionString value="[Complete Connection]" />

connectionStringName構成を使用するだけです。

<connectionStringName value="ApplicationConnection" />

そして、あなたはあなたのアプリケーション接続文字列を持っています:

 <connectionStrings>
     <add name="ApplicationConnection" connectionString="Connection" providerName="System.Data.OracleClient" />
 </connectionStrings>

残念ながら、connectionStringNameにはconnectionTypeが必要です。例:

<appender name="AdoNetAppender_Oracle" type="log4net.Appender.AdoNetAppender">
    <connectionType value="System.Data.OracleClient.OracleConnection, System.Data.OracleClient, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    <connectionStringName value="ApplicationConnection" />
...
37

Webサイト用にlog4netを構成した後、通常はGlobal.asaxで、AdoNetAppenderのConnectionStringを動的に更新できます。 XmlConfigutor()などを使用してlog4netを構成するための呼び出しの後、すべてのAdoNetAppenderをチェックし、必要なconnectionStringを更新する以下のメソッドを呼び出すことができます。

private static void ConfigureLog4Net()
{
    Hierarchy hierarchy = LogManager.GetRepository() as Hierarchy;
    if(hierarchy != null && hierarchy.Configured)
    {
        foreach(IAppender appender in hierarchy.GetAppenders())
        {
           if(appender is AdoNetAppender)
           {
               var adoNetAppender = (AdoNetAppender)appender;
               adoNetAppender.ConnectionString = ConfigurationManager.AppSettings["YOURCONNECTIONSTRINGKEY"].ToString();
               adoNetAppender.ActivateOptions(); //Refresh AdoNetAppenders Settings
           }
        }
    }
}
19
Narayan Akhade

これで、AdoNetAppenderのConnectionStringNameプロパティを使用して、アプリまたはweb.configファイル内の名前付きconnectionStringを指すことができます。

AdoNetAppender.ConnectionStringNameプロパティ

7
David Sette

これを行うには、カスタムADO.NETアペンダーを作成し、接続文字列をオーバーライドします。

public new string ConnectionString {
    get { 
        return base.ConnectionString; 
    }

    //you could set your own connection string here
    set { 
        base.ConnectionString = ConfigurationManager.ConnectionStrings ["Sql"].
            ConnectionString; 
    }
}

完全な例は http://technico.qnownow.com/2012/03/12/how-to-write-custom-ado-net-appender-for-log4net/ にアクセスしてください

1
Veera

これはバージョン1.2.11で可能になるはずです。この問題へのリンクは次のとおりです。

https://issues.Apache.org/jira/browse/LOG4NET-88

0
Stefan Egli

AdoNetAppenderを継承することでそれを行うことができます。

  • 1)AdoNetAppenderから継承するクラスを作成します。
  • 2)次に、Log4NetConnectionStringプロパティを.NetConfigurationManagerによって取得される接続文字列に設定するConnectionStringNameプロパティを作成します。
  • 3)構成ファイルのAdoNetAppenderセクションにConnectionStringNameエントリを作成します。これは、構成ファイルのconnectionStringsセクションにある既存のconnectionStringにマップされます。

詳細については、下記の「Ken Burkhardt」ブログを参照してください。

http://kenny-bu.blogspot.com/2011/03/using-connection-string-name-with.html

0
Min Min