公開時に、SlowCheetah を使用して Log4Net ファイルを変換しています。ただし、異なるアペンダー セクションの属性を区別できないようです。
私の 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>
問題は、変換された構成が両方のアペンダーに対して同じ subject 属性値を持つことです。SetAttributes にヒットすると、探しているタグがわからないので、それらすべてを変換すると思います。同じアペンダー内の要素のみを見つけるように指示する正しい構文は何ですか? xdt:Locator 属性を使用する必要があると思いますが、これらの要素には name 属性がないため、web.config の場合のように Match(name) を実行できません。アペンダー要素には name 属性がありますが、親要素の名前に基づいて一致するように指示する方法がわかりません。
アペンダー ノードで match(Name) を使用して replace を使用できることはわかっていますが、その場合、変換したくないレイアウトなどの要素の束を含むノード全体を置き換えることになります (したがって、同じコードのコピーと貼り付けが複数ありますが、これは避けたいと思います)。