2015-07-06 104 views
1

我已經使用此post創建了自定義xml佈局。我需要日誌消息字符<但在日誌文件中它轉換爲&lt;這是我的代碼示例使用log4net在日誌文件中寫入原始文本

public class MyXmlLayout : XmlLayoutBase 
{ 
    protected override void FormatXml(XmlWriter writer, LoggingEvent loggingEvent) 
    { 
     writer.WriteStartElement("LogEntry"); 
     writer.WriteStartElement("Exception"); 
     writer.WriteString("<![CDATA[\n" + loggingEvent.GetExceptionString() + "\n]]>"); 
     writer.WriteEndElement(); 
     writer.WriteEndElement(); 
    } 
} 

輸出日誌文件

<LogEntry> 
    <Exception>&lt;![CDATA[ 
     System.DivideByZeroException: Attempted to divide by zero. 
      at ConsoleApplication5.Program.Main(String[] args) in c:\Users\MahendranM\Documents\Visual Studio 2013\Projects\ConsoleApplication5\ConsoleApplication5\Program.cs:line 24 
     ]]&gt; 
    </Exception> 
</LogEntry> 

如何打印原始字符像log4net的<,>

回答

2

如果你真的要做到這一點,你可以使用

writer.WriteRaw("<![CDATA[\n" + loggingEvent.GetExceptionString() + "\n]]>"); 

writer.WriteCData(loggingEvent.GetExceptionString()); 

不過,我想極力勸阻你這樣做。不能保證你最終會得到有效的XML ......如果你的文本包含"]]>"那麼它會導致問題。 (如果使用WriteRaw,則最終會生成無效的XML;如果使用WriteCData,則最終會出現異常。)

我期望使用XML日誌文件來簡單地傳播每個日誌條目的數據,以XML格式。因此,只需使用writer.WriteString(loggingEvent.GetExceptionString())然後讀取日誌文件以後可以做它正確的事情。用CData包裝它,而不是讓XML API逃脫它,因爲它對我來說似乎是一個壞主意。

+0

使用CData是個壞主意,但默認log4net只是在寫入長的異常消息時做同樣的事情。 – Mahendran

+0

@Mahendran:這並不意味着你必須這樣做,但...(如果它*使用CData,希望它正在處理']]>問題......) –

+0

使用writer.WriteCData線索當文本包含']]>時出現異常。 – Mahendran