我在发布时使用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>
问题是转换后的配置对两个appender都有相同的subject属性值;我猜当它遇到SetAttributes时,它无法分辨出它正在寻找哪个标签,因此它会转换所有标签。告诉它只找到同一个appender中的元素的正确语法是什么?我假设我需要使用xdt:Locator属性,但我不能像我为web.config那样做Match(name),因为这些元素没有name属性。 appender元素有一个name属性,但我不知道如何根据父元素的名称告诉它匹配。
我知道我可以在appender节点上使用匹配(Name),但后来我将替换整个节点,包括一堆元素,例如我不想转换的布局(因此有多个相同代码的复制粘贴,我想避免使用)。
答案 0 :(得分:2)
我在这篇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)"
...该属性区分大小写。