我使用此post创建了自定义xml布局。我需要带有字符<
的日志消息,但在日志文件中它转换为<
这是我的代码示例
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><![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
]]>
</Exception>
</LogEntry>
如何在log4net中打印<,>
等原始字符?
答案 0 :(得分: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只是逃避它,因为它对我来说似乎是一个坏主意。