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

Write raw text in log file using 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 中像 <,> 那样打印原始字符?

如果您真的想要这样做,您可以使用

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

writer.WriteCData(loggingEvent.GetExceptionString());

但是,我强烈 劝阻您不要这样做。不能保证您最终会得到有效的 XML ...如果您的文本包含 "]]>" 那么它会导致问题。 (对于 WriteRaw,您最终会得到无效的 XML;对于 WriteCData,您将得到异常。)

我希望使用 XML 日志文件的目的只是为了以 XML 格式传播每个日志条目的数据。所以只需使用 writer.WriteString(loggingEvent.GetExceptionString()) 然后 读取 日志文件以后就可以用它做正确的事情。将它包装在 CData 中,而不是让 XML API 只是逃避它,因为它需要对我来说似乎是个坏主意。