2012-04-12 2 views
3

내가 겪고있는 문제는 파일에 XML 태그를 씁니다 만 올바른 형식의 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 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 조각을 파일에 추가하는 것이 더 쉽고 빠릅니다.

관련 문제