2012-04-12 76 views
3

我遇到的问题是它只是将XML标记写入文件,但它不是格式正确的XML文件。Log4Net可以附加到正确结构化的XML文档吗?

该文件只是被填充如下:

<LogEntry><Date>12/04/2012 11:16:26</Date><Message>An error message.</Message><StackTrace>..StackTrace omitted..</StackTrace></LogEntry> 
<LogEntry><Date>12/04/2012 11:21:27</Date><Message>Another error message.</Message><StackTrace>..StackTrace omitted..</StackTrace></LogEntry> 
<LogEntry><Date>12/04/2012 11:21:37</Date><Message>More messages.</Message><StackTrace>..StackTrace omitted..</StackTrace></LogEntry> 

有什么办法,我追加到一个正确的结构化的XML文档?

理想的情况下,将显示如下:

<?xml version="1.0" encoding="utf-8"?> 
<Logs> 
    <LogEntry><Date>12/04/2012 11:16:26</Date><Message>An error message.</Message><StackTrace>..StackTrace omitted..</StackTrace></LogEntry> 
    <LogEntry><Date>12/04/2012 11:21:27</Date><Message>Another error message.</Message><StackTrace>..StackTrace omitted..</StackTrace></LogEntry> 
    <LogEntry><Date>12/04/2012 11:21:37</Date><Message>More messages.</Message><StackTrace>..StackTrace omitted..</StackTrace></LogEntry> 
</Logs> 

我正在使用的代码是:

public class MyXmlLayout : XmlLayoutBase 
{ 
    protected override void FormatXml(XmlWriter writer, LoggingEvent loggingEvent) 
    { 
     writer.WriteStartElement("LogEntry"); 

     writer.WriteStartElement("Date"); 
     writer.WriteString(loggingEvent.TimeStamp.ToString(CultureInfo.CurrentCulture)); 
     writer.WriteEndElement(); 

     writer.WriteStartElement("Message"); 
     writer.WriteString(loggingEvent.RenderedMessage); 
     writer.WriteEndElement(); 

     writer.WriteStartElement("StackTrace"); 
     writer.WriteString(loggingEvent.ExceptionObject.StackTrace); 
     writer.WriteEndElement(); 

     if (loggingEvent.ExceptionObject.InnerException != null) 
     { 
      writer.WriteStartElement("InnerException"); 
      writer.WriteString(loggingEvent.ExceptionObject.InnerException.ToString()); 
      writer.WriteEndElement(); 
     } 

     writer.WriteEndElement(); 
    } 
} 

,并为这个配置是:

<log4net> 
    <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender" > 
    <param name="File" value="Logs/log.xml" /> 
    <param name="AppendToFile" value="true" /> 
    <rollingStyle value="Size" /> 
    <maxSizeRollBackups value="10" /> 
    <maximumFileSize value="10MB" /> 
    <staticLogFileName value="true" /> 
    <layout type="MyNamespace.MyXmlLayout" /> 
    </appender> 

    <root> 
    <level value="DEBUG" /> 
    <appender-ref ref="LogFileAppender" /> 
    </root> 
</log4net> 

回答

5

XmlLayoutBase类不支持你在找什么。原因很简单:如果必须确保xml总是格式良好,那么只要将条目添加到文件中就需要覆盖最后的根节点。简单地将xml片段附加到文件更容易,更快速。

相关问题