我正在做一个使用 log4net 的 ASP.NET 项目。在开发环境中,我希望将@stackTrace
参数的 size
元素设置为比其他环境中更高的值。
log4net.config 文件的结构是:
<?xml version="1.0"?>
<configuration>
<log4net debug="true">
<appender name="SQLServerAppender" type="log4net.Appender.AdoNetAppender">
<parameter>
<parameterName value="@stackTrace"/>
<dbType value="String"/>
<size value="1000"/>
<layout type="log4net.Layout.RawPropertyLayout">
<key value="stackTrace"/>
</layout>
</parameter>
<!-- More parameters -->
</appender>
</log4net>
</configuration>
我想将size
元素的value
属性更改为 2000。
我尝试了以下转换文件,但它没有改变任何东西:
<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<log4net>
<appender name="SQLServerAppender" type="log4net.Appender.AdoNetAppender">
<parameter xdt:Locator="XPath(configuration/log4net/appender[@name='SQLServerAppender']/parameter[parameterName[@value='@stackTrace']])"
xdt:Transform="Remove">
</parameter>
</appender>
</log4net>
</configuration>
"删除"是试图让某些事情发生的最后手段!
我应该怎么做才能执行所需的转换?在这种情况下,我不清楚如何将xdt:Locator
与xdt:Transform
结合起来。
在Eric.Y.Fan的回答不起作用之后,我玩了一会儿,想知道为什么不行。
我首先放回了<connectionString>
值(为了清楚起见,我把它从我的帖子中省略了),它确实有效。这证明找到了正确的<appender>
,但没有找到正确的<parameter>
。"找到"或"找到"。这是一个暗示。
我查看了 XPath 表达式,并意识到它正在尝试查找具有值为 @stackTrace
的 value
属性的<parameterName>
的<parameter>
。所以我尝试使用Condition
:
<parameter xdt:Locator="Condition([parameterName[@value='@stackTrace']])"
xdt:Transform="Replace">
</parameter>
这奏效了!
所以最后的转换是:
<parameter xdt:Locator="Condition([parameterName[@value='@stackTrace']])">
<size value="2000" xdt:Transform="Replace" />
</parameter>
我可能弄错了,但我认为 Web.config 转换不能应用于其他任意 xml 文件。
为此,我通常使用SlowCheetah:http://visualstudiogallery.msdn.microsoft.com/69023d00-a4f9-4a34-a6cd-7e854ba318b5
这是一个很棒的工具,非常易于使用(类似于web.config转换,但可以应用于任何东西),并且还与自动化构建和部署很好地集成。
以下是Scott Hanselman的指南:http://www.hanselman.com/blog/SlowCheetahWebconfigTransformationSyntaxNowGeneralizedForAnyXMLConfigurationFile.aspx
试试这个:
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<log4net>
<appender name="SQLServerAppender" type="log4net.Appender.AdoNetAppender">
<parameter>
<size value="2000" xdt:Locator="XPath(configuration/log4net/appender[@name='SQLServerAppender']/parameter[parameterName[@value='@stackTrace']])" xdt:Transform="SetAttributes"/>
</parameter>
</appender>
</log4net>