使用log4net在日志文件中写入原始文本

时间:2015-07-06 12:14:01

标签: c# log4net

我使用此post创建了自定义xml布局。我需要带有字符<的日志消息,但在日志文件中它转换为&lt;这是我的代码示例

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中打印<,>等原始字符?

1 个答案:

答案 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只是逃避它,因为它对我来说似乎是一个坏主意。