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

标签 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 中?

最佳答案

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

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

writer.WriteCData(loggingEvent.GetExceptionString());

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

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

关于c# - 使用 log4net 在日志文件中写入原始文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31245566/

相关文章:

c# - 如何将 x.ToString() 传递到期望对象类型而不是仅仅 x 的方法中以防止装箱?

c# - Resharper - 可能错误调用 GetType()

c# - RollingFileAppender 中的先前文件名

asp.net - 如何让 log4net 从 web.config 解密加密的连接字符串?

c# - WPF 应用程序中的 Log4Net 设置

c# - 是否可以使 Convert.ChangeType() 接受货币?

c# - Linux 重叠 I/O TCP 套接字服务器未正确响应 C# 异步客户端

c# - 损坏的性能计数器?

c# - 如何在C#中使用\in字符串

.net - 如何在 xunit2 中捕获 log4net 输出