如何通过 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();
}
}
}
覆盖方法也很有效,日志文件包含操作标签之间的消息。但是有一个问题,记录的消息包括消息开头的子字符串 
和消息末尾的 
,即使它们在原始消息中不存在!所以他们也不应该出现在记录的消息中!当人们试图在 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();
我正在使用 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();
}
}
}
覆盖方法也很有效,日志文件包含操作标签之间的消息。但是有一个问题,记录的消息包括消息开头的子字符串 
和消息末尾的 
,即使它们在原始消息中不存在!所以他们也不应该出现在记录的消息中!当人们试图在 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();