【问题标题】:Write raw text in log file using log4net使用 log4net 在日志文件中写入原始文本
【发布时间】:2015-07-06 21:01:45
【问题描述】:

我已经使用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>&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中打印&lt;,&gt;in log4net之类的原始字符?

【问题讨论】:

    标签: c# log4net


    【解决方案1】:

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

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

    或

    writer.WriteCData(loggingEvent.GetExceptionString());
    

    但是,我强烈不鼓励您这样做。无法保证您最终会得到有效的 XML……如果您的文本包含"]]&gt;",那么它将导致问题。 (WriteRaw 会导致 XML 无效;WriteCData 会导致异常。)

    我希望使用 XML 日志文件的目的只是以 XML 格式传播每个日志条目的数据。因此,只需使用writer.WriteString(loggingEvent.GetExceptionString()),然后无论读取日志文件稍后都可以用它做正确的事情。将它包装在 CData 中,而不是让 XML API 在需要时对其进行转义,这对我来说似乎是个坏主意。

    【讨论】:

    • 使用 CData 是个坏主意,但默认 log4net 在写入长异常消息时也会这样做。
    • @Mahendran:但这并不意味着你必须这样做......(如果它确实使用 CData,希望它能够解决 ]]&gt; 问题...)
    • 当文本包含]]&gt;时,使用 writer.WriteCData 会导致异常。
    猜你喜欢
    • 2016-05-08
    • 2012-11-11
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-03
    • 1970-01-01
    相关资源
    最近更新 更多