0

我在发布时使用 SlowCheetah 来转换我的 Log4Net 文件。但是,它似乎无法区分不同 appender 部分中的属性。

我的 Log4Net.config 看起来基本上是这样的:

<?xml version="1.0" encoding="utf-8" ?>

<log4net>
  <appender name="SmtpAppender" type="log4net.Appender.SmtpAppender">
    <to value="DevEmail" />
    <from value="DevEmail" />
    <subject value="Dev Warning" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="Time: %date%newlineHost: %property{log4net:HostName}%newlineClass: %logger%newlineUser: %property{user}%newlineMessage: %message%newline%newline%newline" />
    </layout>
    <threshold value="WARN" />
  </appender>

  <appender name="FatalSmtpAppender" type="log4net.Appender.SmtpAppender">
    <to value="DevEmail" />
    <from value="DevEmail" />
    <subject value="Dev Fatal" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="Time: %date%newlineHost: %property{log4net:HostName}%newlineClass: %logger%newlineUser: %property{user}%newlineMessage: %message%newline%newline%newline" />
    </layout>
    <threshold value="FATAL" />
  </appender>    
</log4net>

我的转换文件如下所示:

<?xml version="1.0" encoding="utf-8" ?>

<log4net xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <appender name="SmtpAppender" type="log4net.Appender.SmtpAppender">
    <to value="ProductionEmail" xdt:Transform="SetAttributes" />
    <from value="ProductionEmail" xdt:Transform="SetAttributes" />
    <subject value="Production Warning" xdt:Transform="SetAttributes" />
  </appender>

  <appender name="FatalSmtpAppender" type="log4net.Appender.SmtpAppender">
    <to value="ProductionEmail" xdt:Transform="SetAttributes" />
    <from value="ProductionEmail" xdt:Transform="SetAttributes" />
    <subject value="Production Fatal" xdt:Transform="SetAttributes" />
  </appender>
</log4net>

问题是转换后的配置对于两个附加程序具有相同的主题属性值;我猜当它遇到 SetAttributes 时,它无法判断它正在寻找哪个标签,因此它会转换所有标签。告诉它只在同一个附加程序中查找元素的正确语法是什么?我假设我需要使用 xdt:Locator 属性,但我不能像 web.config 那样做 Match(name) 因为这些元素没有 name 属性。appender 元素有一个 name 属性,但我不知道如何根据父元素的名称告诉它匹配。

我知道我可以在 appender 节点上使用匹配(名称)替换,但随后我将替换整个节点,包括一堆元素,例如我不想转换的布局(因此有多个相同代码的复制粘贴,我想避免)。

4

1 回答 1

3

我在这篇 MSDN 文章中找到了答案:http: //msdn.microsoft.com/en-us/library/dd465326.aspx

我需要xdt:Locator="Match(name)"在父<appender>节点上使用,然后xdt:Transform在子节点上使用。我以前尝试过这个,但使用了xdt:locator="Match(name)"而不是xdt:Locator="Match(name)"......该属性区分大小写。

于 2013-11-12T18:06:41.960 回答