由于log4net本身没有提供设置数据库连接串的方法,因此当需要运行时设置连接串就比较困难,我在网上找了很久,发现也有人提出过类似的问题,但是却没有找到解决方案。于是查看log4net的代码,找到了一个以XmlElement作为参数的配置方法:log4net.Config.XmlConfigurator.Configure(XmlElement element)。想了一下,其实可以运行时加载log4net的配置,然后修改ConnenctionString,再调用此方法进行配置即可。
以下是log4net的部分配置:
<configuration>
...
<log4net>
<logger name="NHibernate" additivity="false">
<level value="OFF"/>
<appender-ref ref="AdoNetAppender"/>
</logger>
<logger name="NHibernate.SQL" additivity="false">
<level value="OFF"/>
<appender-ref ref="AdoNetAppender"/>
</logger>
<root>
<level value="ALL"/>
<appender-ref ref="AdoNetAppender"/>
</root>
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
<param name="BufferSize" value="1"/>
<param name="ConnectionType" value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
<param name="ConnectionString" value=""/><!--在代码中设置-->
...
</log4net>
...
</configuration>
以下是设置连接串的代码:
...
//解析连接串
ConnectionString = "数据库连接串";
//log4net配置连接串
XmlNode log4NetconnNode = xmlDoc.SelectSingleNode("/configuration/log4net/appender/param[@name=\"ConnectionString\"] ");
log4NetconnNode.Attributes["value"].Value = ConnectionString;
log4net.Config.XmlConfigurator.Configure(xmlDoc.SelectSingleNode("/configuration/log4net") as XmlElement);
...