如何通过 c# 替换 log4net 的 xml 输出中不需要的默认子字符串

how to replace unwanted default substrings in the xml output of log4net via c#

我正在使用 Log4Net 记录客户端通过我们的 socketlistener 应用程序发送到服务器的消息。这是我的 log4net appender 的代码。

<appender name="FileAppender" type="log4net.Appender.RollingFileAppender,log4net">
      <file value="C:\Logs\Socketlogs.xml" />
      <appendToFile value="true" />
      <rollingStyle value="Date"/>
      <datePattern value="-yyyy.MM.dd.\t\x\t"/>
      <maximumFileSize value="4096KB"/>
      <maxSizeRollBackups value="30"/>
      <param name="StaticLogFileName" value="false"/>
      <layout type="SocketListener.MessageProcessors.MyXmlLayout" />
      <filter type="log4net.Filter.LevelRangeFilter">
        <levelMin value="DEBUG" />
        <levelMax value="WARN" />
      </filter>
    </appender>

请注意,log4net 运行良好,应用程序正在积极记录。

在这里,我也想覆盖log4net默认的xml布局,因为它的结构不符合我的要求。

namespace SocketListener.MessageProcessors
{
  public class MyXmlLayout : log4net.Layout.XmlLayoutBase
  {
    protected override void FormatXml(XmlWriter writer, log4net.Core.LoggingEvent loggingEvent)
     {
        writer.WriteStartElement("action");
        writer.WriteString(loggingEvent.RenderedMessage);
        writer.WriteEndElement();
     }
  }
}

覆盖方法也很有效,日志文件包含操作标签之间的消息。但是有一个问题,记录的消息包括消息开头的子字符串 &#xB; 和消息末尾的 &#x1C;,即使它们在原始消息中不存在!所以他们也不应该出现在记录的消息中!当人们试图在 notepad++ 上验证 xml 代码时,它们也会导致错误。所以我们需要在记录的消息中去掉它们。

问题是,当我检查应用程序上的 loggingEvent.RenderedMessage 时,我没有在消息中看到这个字符,这就是为什么 String.Replace、String.Split 等有点功能无法删除它们,因为它们无法检测到它们。请注意,这里也没有特殊字符需要转义。

所以我卡住了。任何帮助将不胜感激!我应该怎么办?谢谢!

编辑:请注意:在记录消息后读取日志文件、删除不需要的子字符串并重写文件在我的情况下不是一个选项。

这很有效:

string mess = System.Text.RegularExpressions.Regex.Replace(loggingEvent.RenderedMessage, @"[\u0000-\u0008\u000B\u000C\u000E-\u001F]", "");
writer.WriteStartElement("message");
writer.WriteString(mess);
writer.WriteEndElement();