【问题标题】:How to log a message when the BufferingForwardingAppender is flushed?刷新 BufferingForwardingAppender 时如何记录消息?
【发布时间】:2011-05-09 21:24:42
【问题描述】:

ERROR 发生时,我有一个BufferingForwardingAppender configured 将最后10 条消息转发给RollingFileAppender。我可以在每批消息之前在日志中显示一条自定义消息吗?

我想指出这是一个新的ERROR 事件及其上下文,以便日志可读?

我的 log4net 配置是这样的:

<appender name="ErrorBufferingAppender" type="log4net.Appender.BufferingForwardingAppender">
  <bufferSize value="10" />
  <lossy value="true" />
  <evaluator type="log4net.Core.LevelEvaluator">
    <threshold value="ERROR" />
  </evaluator>
  <appender-ref ref="ErrorFileAppender" />
</appender>

<appender name="ErrorFileAppender" type="log4net.Appender.RollingFileAppender">
  <param name="File" value="logs\Errors.txt"/>
  <!-- other important parameters -->
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date [%-4thread] %-5level %logger{1} - %message%newline"/>
  </layout>
</appender>

我想要的输出有点像这样

---------- ERROR ----------
2011-05-09 16:59:12,327 [8   ] INFO  AppLogger - DiskStorageMonitor.StartMonitoring()
2011-05-09 16:59:12,331 [8   ] INFO  AppLogger - DiskStorageMonitor.Initializing File System Watcher...
2011-05-09 16:59:12,341 [8   ] INFO  AppLogger - DiskStorageMonitor - LocalSlideDataStorageDrive: C:
2011-05-09 16:59:12,370 [8   ] INFO  AppLogger - Transition: From 'MinimumDiskSpaceQuotaState' to 'IdleState'.
2011-05-09 16:59:26,697 [8   ] INFO  AppLogger - Transition: From 'IdleState' to 'SlideHolderMacroState'.
2011-05-09 16:59:26,702 [8   ] INFO  AppLogger - Transition: From 'SlideHolderMacroState' to 'WaitingForMacroCmdResponseState'.
2011-05-09 16:59:26,781 [12  ] INFO  YStageManager - Moving to: -1.25
2011-05-09 16:59:26,782 [14  ] INFO  XStageManager - Moving to: -142
2011-05-09 16:59:30,800 [12  ] ERROR RecoveringErrorHandler - An error occurred. Retrying... (snipped exception message & stacktrace)

---------- ERROR ----------
2011-05-09 16:59:30,808 [12  ] WARN  MacroCameraRecoverySteps - An error occurred while calling the macro camera. Resetting and retrying...
2011-05-09 16:59:30,809 [12  ] INFO  MacroCameraManager - Resetting the Macro Camera.
2011-05-09 16:59:30,886 [12  ] ERROR GetMacroImageCommandHandler - Macro image processing failed for the slide in position 0. (snipped exception message & stacktrace)

【问题讨论】:

    标签: log4net log4net-configuration


    【解决方案1】:

    我有一个可能对您有用的解决方案,但它是一种变通方法。基本上,设置两个附加程序写入同一个文件。当您写入错误(这将触发缓冲区清除到您的日志文件)时,让另一个附加程序首先写入“-------Error--------”文本,并在文本。

    您将不得不对其进行一些尝试才能使其正常工作,但这应该是一个可行的解决方案。 Apache 确实允许多个附加程序写入同一个文件。只需确保将 +MinimalLock 放在附加程序上,这样它们就不会锁定文件。这是一个 SO 链接,它解释了两个附加程序如何写入同一个文件:

    Can Log4net have multiple appenders write to the same file?

    【讨论】:

    • 听起来不错,我正在考虑如何在每个类中没有两个可能写入错误消息的记录器实例的情况下做到这一点。
    • @Anthony Mastrean - 你不需要每个类中的两个实例,只需要两个附加程序。第二个只会响应 ERROR 事件。我错过了什么吗?
    • 我不明白第二个附加程序如何神奇地将“---Error---”写入日志而没有消息......你是说Layout只是字符串, 没有 %message 模式?
    • @Anthony Mastrean - 您将创建第二个附加程序来接收错误事件。这样,当您遇到错误时,两个附加程序都会触发。新的将有一个模式,只是将“----Error----”和一个新行写入文本文件,然后您的原始缓冲附加程序将触发对同一日志文件的写入。使用代码中的一个日志命令,您可以启动任意数量的附加程序。
    • 我在禁止打印消息中的异常时遇到问题...我收到“----- ERROR ----- : message ”跨度>
    【解决方案2】:

    感谢BiggsTRC 的精彩回答。这是我的工作 log4net 配置和示例输出。

    此附加程序通过在日志中写入上下文“标头”来响应任何ERROR 消息。日志被最低限度地锁定以允许它和缓冲附加程序写入文件。设置为falseignoresException 标签实际上告诉log4net this 布局将写入异常(而不是在消息下方自动写入)。但我真的不想要它,那是在另一个 appender 中。

    <appender name="ErrorSectionAppender" type="log4net.Appender.FileAppender">
      <filter type="log4net.Filter.LevelMatchFilter">
        <levelToMatch value="ERROR" />
      </filter>
      <filter type="log4net.Filter.DenyAllFilter" />
      <file value="logs\Errors.txt" />
      <appendToFile value="true" />
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
      <layout type="log4net.Layout.PatternLayout">
        <ignoresException value="false" />
        <conversionPattern value="%newline---------- ERROR @ %date ----------%newline" />
      </layout>
    </appender>
    

    此附加程序会缓冲所有消息,直到出现 ERROR 消息,然后它将最后 10 条 (bufferSize) 消息和错误消息转储到 ErrorFileAppender

    <appender name="ErrorBufferingAppender" type="log4net.Appender.BufferingForwardingAppender">
      <bufferSize value="10" />
      <lossy value="true" />
      <evaluator type="log4net.Core.LevelEvaluator">
        <threshold value="ERROR" />
      </evaluator>
      <appender-ref ref="ErrorFileAppender" />
    </appender>
    

    这是实际的错误文件附加程序。转换模式是标准的。请注意此处的最小文件锁定。

    <appender name="ErrorFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="logs\Errors.txt"/>
      <appendToFile value="true"/>
      <staticLogFileName value="true"/>
      <rollingStyle value="Size"/>
      <maxFileSize value="1048576"/>
      <maxSizeRollBackups value="-1"/>
      <countDirection value="1"/>
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%-4thread] %-5level %logger{1} - %message%newline"/>
      </layout>
    </appender>
    

    这些 appender 的输出如下所示

    ---------- ERROR @ 2011-05-13 13:51:22,632 ----------
    2011-05-13 13:51:04,937 [9   ] INFO  OmnyxScannerLogger - Transition: From 'No State' to 'CommunicationSyncState'.
    2011-05-13 13:51:05,363 [12  ] DEBUG IMacroImageProcessor - hello, 10
    2011-05-13 13:51:05,369 [19  ] INFO  XStageManager - Connecting
    2011-05-13 13:51:05,369 [12  ] INFO  ZStageManager - Connecting
    2011-05-13 13:51:05,369 [16  ] INFO  YStageManager - Connecting
    2011-05-13 13:51:05,393 [9   ] INFO  OmnyxScannerLogger - Transition: From 'CommunicationSyncState' to 'SystemInitializeState'.
    2011-05-13 13:51:08,528 [17  ] INFO  YStageManager - Homing
    2011-05-13 13:51:08,539 [12  ] INFO  ZStageManager - Homing
    2011-05-13 13:51:22,632 [14  ] ERROR RecoveringErrorHandler - An error occurred. Retrying...
    Omnyx.Scanner.CliContracts.ScannerException: Injected: The stage failed to home.
       at Omnyx.Scanner.Simulation.ErrorInjection.ErrorInjectionInterceptor.Intercept(IInvocation invocation) in D:\Simulation\ErrorInjection\ErrorInjectionInterceptor.cs:line 42
       at Castle.DynamicProxy.AbstractInvocation.Proceed()
       at Castle.Proxies.IXStageManagerProxy.Home()
    
    ---------- ERROR @ 2011-05-13 13:51:33,758 ----------
    2011-05-13 13:51:29,034 [9   ] INFO  OmnyxScannerLogger - DiskStorageMonitor.StartMonitoring()
    2011-05-13 13:51:29,037 [9   ] INFO  OmnyxScannerLogger - DiskStorageMonitor.Initializing File System Watcher...
    2011-05-13 13:51:29,046 [9   ] INFO  OmnyxScannerLogger - DiskStorageMonitor - LocalSlideDataStorageDrive: C:
    2011-05-13 13:51:29,062 [9   ] INFO  OmnyxScannerLogger - -- LocalSlideDataStorageOverhead: 0
    2011-05-13 13:51:29,075 [9   ] INFO  OmnyxScannerLogger - Transition: From 'MinimumDiskSpaceQuotaState' to 'IdleState'.
    2011-05-13 13:51:31,727 [9   ] INFO  OmnyxScannerLogger - Transition: From 'IdleState' to 'SlideHolderMacroState'.
    2011-05-13 13:51:31,732 [9   ] INFO  OmnyxScannerLogger - Transition: From 'SlideHolderMacroState' to 'WaitingForMacroCmdResponseState'.
    2011-05-13 13:51:31,792 [12  ] INFO  YStageManager - Moving to: -1.25
    2011-05-13 13:51:31,793 [20  ] INFO  XStageManager - Moving to: -142
    2011-05-13 13:51:33,758 [12  ] ERROR RecoveringErrorHandler - An error occurred. Retrying...
    Omnyx.Scanner.CliContracts.ScannerException: Injected: The macro camera failed.
       at Omnyx.Scanner.Simulation.ErrorInjection.ErrorInjectionInterceptor.Intercept(IInvocation invocation) in D:\Simulation\ErrorInjection\ErrorInjectionInterceptor.cs:line 42
       at Castle.DynamicProxy.AbstractInvocation.Proceed()
       at Castle.Proxies.IMacroCameraManagerProxy.TakeTopLitAndBackLitPictures()
    

    【讨论】:

    • 啊,ManagerProxies...不错 ;-)
    • @anthony:ErrorSectionAppenderappender-ref 呢?
    • @eyal 据我记得......它不需要 ref,因为它直接写入日志。缓冲和转发 appender 通常有 refs。
    • @AnthonyMastrean 我不知道!我想我没有使用'FileAppender',所以我总是不得不参考我使用的滚动和缓冲。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-20
    • 2019-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多