log4net 生成无效 xml

log4net generates invalid xml

我正在使用 log4net 登录 XML 格式。

我正在使用以下配置:

  <appender name="RollingLogFileAppenderError" type="log4net.Appender.RollingFileAppender, log4net">
    <file type="log4net.Util.PatternString" value="App_Log\Service.Error.xml"/>
    <staticLogFileName value="false"/>
    <preserveLogFileNameExtension value="true"/>
    <appendToFile value="true"/>
    <rollingStyle value="Date"/>
    <datePattern value=".yyyy-MM-dd"/>
    <filter type="log4net.Filter.LevelMatchFilter">
      <acceptOnMatch value="true"/>
      <levelToMatch value="ERROR"/>
    </filter>
    <filter type="log4net.Filter.DenyAllFilter"/>
    <layout name="StandardLayout" type="log4net.Layout.PatternLayout">
      <header>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&lt;LogEntries&gt;</header>
      <footer>&lt;/LogEntries&gt;
      <conversionPattern value="&lt;LogEntry date=&quot;%date&quot; level=&quot;%level&quot; logger=&quot;%logger&quot; method=&quot;%aspnet-context{LogMethodName}&quot;&gt;%message&lt;/LogEntry&gt;%newline"/>
    </layout>
  </appender>

现在可以使用了,除了我需要查看最新日志文件的情况。那么它是无效的,其中包含类似:

<?xml version="1.0" encoding="UTF-8"?>
<LogEntries>
  <LogEntry>....</LogEntry>

没有页脚,自然无效

文件被收集到一个中央位置,我们希望在该位置可视化日志中的信息。但是由于一些日志文件是无效的,这会产生一些问题。

现在我可以在将文件读入可视化工具之前对其进行预处理,但我更希望拥有有效的 xml 文件。

有人对如何处理这个问题有建议吗?

编辑:

另一种解决方案是不登录XML,但要登录例如JSON,据我所知也需要root "element",好像也存在同样的问题

您的问题是页脚是在您的应用程序停止或使用新日志文件启动时写入的。 Log4net (rollingfileappender) 无法提前添加页脚,因为它不会在添加新条目时将其删除。为了克服这个问题,你可以制作一个 xml appender,它实现了 SkelitonAppender 或 RollingFileAppender,它在写入新日志条目时添加和删除页脚。

更简单的方法是让您的文件更小,因此您确实需要查看最新文件。

顺便说一下,一种更简单的转换方法是在配置中使用布局元素:

  <layout type="XmlLayout" />

并创建一个 XmlLayout class:

public class XmlLayout : XmlLayoutBase
{
protected override void FormatXml(XmlWriter writer, LoggingEvent loggingEvent)
{
    writer.WriteStartElement("LogEntry");
    writer.WriteStartElement("Message");
    writer.WriteString(loggingEvent.RenderedMessage);
    writer.WriteEndElement();
    writer.WriteEndElement();
}
}