动态log4net appender名称?

时间:2010-04-13 18:19:08

标签: c# logging log4net

假设我在同一个log4net文件中有3个smtp appender,其名称为:

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

假设我有3种不同的服务器(Dev,Beta,Production)。根据服务器,我想激活日志。如果是开发服务器,它将从“emailDevelopment”触发日志。我在每个名为“ApplicationEnvironment”的服务器中都有一个系统变量,其值为Development,Beta,Production,基于服务器名称。无论如何我现在可以在log4net中设置root,以便根据服务器名称触发电子邮件。

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

2 个答案:

答案 0 :(得分:4)

答案 1 :(得分:1)

即使在写完XSD file for log4net configuration之后,我仍然没有意识到实现这一目标的简单方法。

您可以执行以下操作:

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

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

现在,您可以使用以下日期格式引用此值:“%property {host}”

要执行过滤,您需要在适配器中使用过滤器配置:

<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,并为您要发送的每个电子邮件地址提供三个公共属性。这不难,试一试!