想让log4net 生成XML的输出, 用的还是 FileAppender, 只不要指定其 Layout属性为 XmlLayout:
<appender name="XmlFileAppender" type="log4net.Appender.FileAppender">
<file value="app.log" />
<layout type="log4net.Layout.XmlLayout" /> </appender>
|
但是, 默认生成的格式却是:
一堆XML元素挤在同一行上, 可读性极差.
好在log4net提供了源码, 可以很容易地修改代码生成下面的缩进输出:
<log4net:event logger="ControlPanelApp.MainApp" timestamp="2007-12-17T10:20:34.3593750+08:00" level="INFO" thread="7400" domain="ControlPanelApp.exe" username="ZHAORUFEI\zhao">
<log4net:message>Close PCS</log4net:message>
<log4net:properties>
<log4net:data name="log4net:HostName" value="zhaorufei" />
</log4net:properties>
</log4net:event>
|
可以看到, XML元素都被以2个空格缩进了, 下面简单说下要修改的地方:
src\Layout\XMLLayoutbase.cs
中的
Format 函数, 在其中加上下面2行代码:
XmlTextWriter xmlWriter = new XmlTextWriter(m_protectCloseTextWriter);
xmlWriter.Formatting = Formatting.None;
//
// I prefered indent with 2 spaces
//
xmlWriter.Formatting = Formatting.Indented;
xmlWriter.Indentation = 2;
xmlWriter.Namespaces = false;
// Write the event to the writer
FormatXml(xmlWriter, loggingEvent);
|
前后的其它代码只是为了提供上下文的.
要成功编译一个release版的 log4net还需要修改下面一个文件:
AssemblyInfo.cs
因为log4net的 release用了强签名, 而签名文件我们并没有, 所以需要把强签名关闭:
#if false && STRONG && (CLI_1_0 || NET_1_0 || NET_1_1 || NETCF_1_0 || SSCLI)
[assembly: AssemblyDelaySign(false)]
[assembly: AssemblyKeyFile(@"..\..\..\log4net.snk")]
#endif
|
#if 后面的 false是新加的, 用来关闭强签名
另外, log4net为了最大限度的兼容性, 项目的csproj文件中定义的宏是 NET_1_0, 可以根据自己的需要改成 NET_1_1, 或NET_2_0, 然后再编译.
同样的原因, 项目的csproj指定的输出路径是
build\bin\net\1.0\release
build\bin\net\1.0\debug
这仅是个目录名, 生成的 log4net.dll 就放在这个目录下.
把新生成的log4net.dll 替换你已经编译好可执行文件目录下, 并不能直接使用, 因为你原来引用的官方发布的log4net.dll是一个强签名文件, 所以这会抛出一个 TypeInitialization的异常, 你的项目需要在引用了新的log4net.dll的情况下重新编译一次.
阅读(2078) | 评论(0) | 转发(0) |