2012-04-12 18 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フラグメントを追加するだけで、簡単かつ迅速に処理できます。

関連する問題