我正在尝试在部署后更改日志文件名,因此转换它:
<log4net>
...
<appender name="GeneralAppender" type="log4net.Appender.RollingFileAppender, log4net">
<file value="c:\logs\Co.App.log" />
...
</appender>
</log4net>
到此:
<log4net>
...
<appender name="GeneralAppender" type="log4net.Appender.RollingFileAppender, log4net">
<file value="c:\logs\Co.App.localhost.log" />
...
</appender>
</log4net>
实际的文件节点没有任何属性,所以我试图通过父节点找到它
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<log4net>
<appender >
<file value="c:\logs\Co.App.localhost.log" xdt:Transform="Replace" xdt:Locator="XPath(../appender[@name='GeneralAppender'])" />
</appender>
</log4net>
</assemblyBinding>
</runtime>
我也尝试了绝对和相对xpath的所有排列,但我没有看到它对变换预览有任何影响。
我试过了:
XDT:定位=&#34;的XPath(//附加器[@name =&#39; GeneralAppender&#39;] /文件)&#34;
甚至:
XDT:变换=&#34;删除&#34; XDT:定位=&#34;的XPath(//文件)&#34;
答案 0 :(得分:12)
<file value="c:\logs\Co.App.local.log" xdt:Transform="Replace" xdt:Locator="Condition(../@name='GeneralAppender')" />
答案 1 :(得分:2)
轻微扩展:
如果父节点有两个(或更多子节点),则上述解决方案是不够的。
当使用EventLogAppend时,log4net就是这种情况,它具有:
<appender name="EventLogAppender" type="log4net.Appender.EventLogAppender" >
...
<param name="LogName" value="MyLog"/>
<param name="ApplicationName" value="MyApplication"/>
...
然后你需要使用&#39;和&#39; +更多属性来命中正确的节点: 比如xdt:Locator =&#34;条件(../@ name =&#39; EventLogAppender&#39; 和@name =&#39; LogName&#39; )
EventLogAppender的示例,其中两个参数都被替换:
<param name="LogName" value="MyNewLog" xdt:Transform="Replace" xdt:Locator="Condition(../@name='EventLogAppender' and @name='LogName')" />
<param name="ApplicationName" value="MyNewApplication" xdt:Transform="Replace" xdt:Locator="Condition(../@name='EventLogAppender' and @name='ApplicationName')" />
答案 2 :(得分:0)
MSDN documentation提到,如果您使用XPath,则它将在传递文件中附加传递给当前上下文的表达式。因此,XPath非常适合您要修改当前元素或其前身之一的情况。
就好像您想以相对方式遍历父级一样,没有XPath表达式可以这样做。 XPath以父级开头,并允许您遍历子级而不是子级。那是条件起作用的时候。
我尝试使用xdt:Locator =“ XPath(。)”,它可以很好地替换当前元素,并且在需要时可以替换它的后代。但这并不适合上升。