log4net生成无效的xml

时间:2015-07-02 08:23:53

标签: xml logging log4net logfiles

我正在使用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,我理解也需要根“元素”,似乎存在同样的问题。

1 个答案:

答案 0 :(得分:1)

您的问题是当您的应用程序停止或以新日志文件启动时会写入页脚。 Log4net(rollingfileappender)之前无法添加页脚,因为在添加新条目时它不会删除它。为了解决这个问题,您可以创建一个xml appender来实现SkelitonAppender或RollingFileAppender,它在编写新的日志条目时添加和删除页脚。

更容易让您的文件变小,因此您需要查看最新文件。

更简单的方法是使用配置中的布局元素:

  <layout type="XmlLayout" />

制作一个XmlLayout类:

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();
}
}