简体   繁体   English

你可以从web.config文件中的其他地方为log4net AdoNetAppender提取connectionString吗?

[英]Can you pull the connectionString for a log4net AdoNetAppender from elsewhere in a web.config file?

I already have a db connection string in my web.config file. 我的web.config文件中已经有一个db连接字符串。 I scanned the log4net docs, but can't seem to find a way to use it within the log4net section of my web.config file. 我扫描了log4net文档,但似乎找不到在我的web.config文件的log4net部分中使用它的方法。 Is is possible to do something like this? 有可能做这样的事吗?

<connectionStrings>
    <add name="connStr" connectionString="Data Source=localhost; ..." />
</connectionStrings>

<log4net>
    <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
    <connectionString connectionStringName="connStr"/>
      ...
</log4net>

It is possible to use a DB connection string specified in web.config without creating a new class, though you would need to use log4net build that hasn't been released yet. 虽然您需要使用尚未发布的log4net构建,但可以使用web.config中指定的DB连接字符串而无需创建新类。 It can be downloaded from SVN repository http://svn.apache.org/viewvc/logging/log4net/trunk/ 它可以从SVN存储库下载http://svn.apache.org/viewvc/logging/log4net/trunk/

Your config will look as follows: 您的配置如下所示:

<connectionStrings>
    <add name="connStr" connectionString="Data Source=localhost; ..." />
</connectionStrings>

<log4net>
    <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
    <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    <connectionStringName value="connStr" />
      ...
</log4net>

Please note that connectionType still needs to be specified. 请注意,仍然需要指定connectionType

Create a class that extends AdoNetAppender - say, WebAppAdoNetAppender . 创建一个扩展AdoNetAppender的类 - 比如WebAppAdoNetAppender Implement the ConnectionString property in that class, and retrieve the connection string from your web.config file in that property setter. 在该类中实现ConnectionString属性,并从该属性setter中的web.config文件中检索连接字符串。

<log4net>
    <appender name="AdoNetAppender" type="MyApp.WebAppAdoNetAppender">
    ...

... ...

public class WebAppAdoNetAppender : log4net.Appender.AdoNetAppender
{
    public new string ConnectionString
    {
        get { return base.ConnectionString; }
        set { base.ConnectionString = ...   }
    }
}

fyi this will be implemented in 1.2.11 according to this . 根据这个,这将在1.2.11中实施。 however I have no idea when they are going to release it. 但我不知道他们何时会发布它。

the answers above all do not work. 上面的答案都行不通。 i got another solution for this, i tried and it worked: 我得到了另一个解决方案,我尝试了它的工作原理:

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
           }
        }
    }
}

How i can use the connectionString of the current website for log4Net instead of configuring 我如何使用当前网站的connectionString for log4Net而不是配置

As of 2017 (log4net 2.0.8.0 ), the following works: 截至2017年(log4net 2.0.8.0 ),以下工作:

public class MyAdoNetAppender : AdoNetAppender
{
    public MyAdoNetAppender()
    {
        ConnectionString = ...
    }
}


<appender name="AdoNetAppender" type="MyApp.MyAdoNetAppender">

(Very similar to @Michael Petrotta's answer) (非常类似于@Michael Petrotta的回答)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM