你能否从web.config文件的其他位置提取log4net AdoNetAppender的connectionString?

44

我在web.config文件中已经有了一个数据库连接字符串。我查阅了log4net文档,但似乎找不到一种在web.config文件的log4net部分中使用它的方法。这样做可能吗?

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

<log4net>
    <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
    <connectionString connectionStringName="connStr"/>
      ...
</log4net>
5个回答

50

可以在不创建新类的情况下使用web.config中指定的DB连接字符串,但需要使用尚未发布的log4net版本。可以从SVN存储库http://svn.apache.org/viewvc/logging/log4net/trunk/下载。

您的config将如下所示:

<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>
请注意,仍需要指定connectionType

16
最新版本1.2.11已经发布,现在可以使用了。运行良好。 - dove

32

创建一个继承AdoNetAppender的类,比如说WebAppAdoNetAppender。在这个类中实现ConnectionString属性,并在属性设置器中从你的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 = ...   }
    }
}

1
Stefan Egli的链接表明参数尚不存在。目前来看,这似乎是最好的解决方法。谢谢Petrotta先生! - MrSharps
我该如何在哪里加载/调用/使用这个类?我刚开始学习log4net,但我发现文档有点匮乏。我正在Quartz.NET作业中运行此程序,它会为我实例化记录器。我该如何用我的子类替换默认的记录器?谢谢。 - InteXX

5

提醒一下,根据这个链接的说明,该功能将在1.2.11版本中实现。但我不知道它们何时发布此版本。


听起来我想要的功能即将推出。 - MrSharps

5
上面的答案都不起作用。我有另一种解决方案,我尝试过了,它有效:
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
           }
        }
    }
}

如何使用当前网站的连接字符串来代替配置Log4Net


我也无法让上面的代码工作,但是这个可以。对我来说,我必须确保在配置文件中有一个空的 ConnectionString:<connectionstring value="" />。 - Philip Pittle

0
截至2017年(log4net 2.0.8.0版本),以下内容可行:
public class MyAdoNetAppender : AdoNetAppender
{
    public MyAdoNetAppender()
    {
        ConnectionString = ...
    }
}


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

(与@Michael Petrotta的答案非常相似)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接