修改log4net 生成换行, 缩进的XML输出

想让log4net 生成XML的输出, 用的还是 FileAppender, 只不要指定其 Layout属性为 XmlLayout:

<appender name="XmlFileAppender" type="log4net.Appender.FileAppender">
      <file value="app.log" />
      <layout type="log4net.Layout.XmlLayout" />
</appender>


但是, 默认生成的格式却是:

<log4net:event logger="ControlPanelApp.MainApp" timestamp="2007-12-17T10:11:29.9375000+08:00" level="INFO" thread="7768" domain="ControlPanelApp.exe" username="ZHAORUFEI\zhao"><log4net:message>Close PCS</log4net:message><log4net:global-properties><log4net:data name="log4net:HostName" value="zhaorufei" /></log4net:global-properties></log4net:event>

一堆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的情况下重新编译一次.
posted @ 2008-01-28 15:20 Salesforce 阅读(...) 评论(...)  编辑 收藏