【问题标题】:log4net generates invalid xmllog4net 生成无效的 xml
【发布时间】:2015-09-19 16:03:18
【问题描述】:

我正在使用 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,据我所知,它也需要一个根“元素”,似乎存在同样的问题。

【问题讨论】:

    标签: xml logging log4net logfiles


    【解决方案1】:

    您的问题是当您的应用程序停止或以新日志文件启动时会写入页脚。 Log4net (rollingfileappender) 不能更早地添加页脚,因为它不会在添加新条目时将其删除。为了克服这个问题,您可以创建一个实现 SkelitonAppender 或 RollingFileAppender 的 xml appender,在编写新日志条目时添加和删除页脚。

    更容易使文件更小,因此您确实需要查看最新文件。

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

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

    【讨论】:

      猜你喜欢
      • 2011-01-07
      • 2023-03-04
      • 1970-01-01
      • 2019-06-15
      • 2013-12-23
      • 2023-03-11
      • 2013-02-05
      • 1970-01-01
      • 2012-08-27
      相关资源
      最近更新 更多