3

私が抱えている問題は、XML タグをファイルに書き込むだけで、正しくフォーマットされた 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>
4

1 に答える 1

5

このXmlLayoutBaseクラスは、探しているものをサポートしていません。理由は非常に単純です。xml が常に適切にフォーマットされていることを確認する必要がある場合、エントリがファイルに追加されるたびに終了ルート ノードを上書きする必要があります。単純に xml フラグメントをファイルに追加する方が簡単で高速です。

于 2012-04-12T12:19:10.837 に答える