2010-04-13 86 views
2

比方说,我有相同的log4net的文件3个SMTP追加程序,其名称是:动态log4net appender的名字?

<appender name = "emailDevelopment".. /> 
<appender name = "emailBeta".. /> 
<appender name = "emailProduction".. /> 

比方说,我有3个不同的服务器(开发,测试版,生产)。取决于服务器,我想开启日志。在开发服务器的情况下,它会从“emailDevelopment”触发日志。我在每个名为“ApplicationEnvironment”的服务器中有一个系统变量,其值是基于服务器名称的Development,Beta,Production。现在,无论如何,我可以在log4net中设置root,以便根据服务器名称触发电子邮件。

<root> 
     <priority value="ALL" />   
     <appender-ref ref="email<environment name from whose appender should be used>" />  
</root> 

回答

1

即使写过的唯一XSD file for log4net configuration我仍然不知道一个简单的方法来实现这一目标后。

你也许能够做一些事情,如:“%产权(东道国)”

要进行滤波,你将需要:

log4net.GlobalContext.Properties["host"] = new ClassThatToStringsHost(); 

class ClassThatToStringsHost 
{ public override string ToString() { return "whatever"; } } 

现在你可以从日志格式引用此值在适配器中使用过滤器配置:

<appender name="file" type="log4net.Appender.RollingFileAppender"> 
    <filter type="log4net.Filter.PropertyFilter"> 
    <Key value="host" /> 
    <StringToMatch value="whatever" /> 
    </filter> 

    <!-- Anything not accepted by the above should be excluded --> 
    <filter type="log4net.Filter.DenyAllFilter" /> 
</appender> 

甚至可能有一个内置属性,您可以利用,这应该工作。另见这篇文章:http://geekswithblogs.net/rgupta/archive/2009/03/03/dynamic-log-filenames-with-log4net.aspx

对于我,我自己和我......我会以另一种方式将它们联系在一起。我将从默认值和ActivateOptions()方法中派生出我自己的SMTP appender,并根据环境配置值。这将允许您使用一个具有一致规则的SMTP appender,但为要发送的每个电子邮件地址提供三个公共属性。这并不难,试试吧!

4

这不会直接回答你的问题,但另一种方法是简单地有多个log4net配置文件,并在右边调用XmlConfigurator.Configure()。例如,您可能有Logging.Development.ConfigLogging.Beta.Config等。

在代码的某处,您可以确定“环境”并使用所需的文件进行配置。

我甚至已经拥有多个配置文件,并将它们的不同部分放到代表“真实”配置的单个XML中,然后调用Configure()方法。例如,Logging.Appenders.Config其中包含所有appender,并将它们全部取出,并将其与上面的一个特定于环境的配置文件结合使用;特定环境的只是简单地引用他们需要的内容,而其余的则是针对该环境的非活动/未引用的。