Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2311656
  • 博文数量: 527
  • 博客积分: 10343
  • 博客等级: 上将
  • 技术积分: 5565
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-26 23:05
文章分类

全部博文(527)

文章存档

2014年(4)

2012年(13)

2011年(19)

2010年(91)

2009年(136)

2008年(142)

2007年(80)

2006年(29)

2005年(13)

我的朋友

分类: WINDOWS

2007-12-17 10:36:24

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

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


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

Close PCS

一堆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的情况下重新编译一次.
阅读(2040) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~