Как записать сообщение, когда BufferingForwardingAppender очищен? - PullRequest
2 голосов
/ 10 мая 2011

У меня есть BufferingForwardingAppender , настроенный для пересылки последних 10 сообщений на RollingFileAppender, когда происходит ERROR. Могу ли я получить собственное сообщение, которое будет отображаться в журнале перед каждой партией сообщений?

Я хочу указать, что это новое 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)

Ответы [ 2 ]

2 голосов
/ 13 мая 2011

Спасибо BiggsTRC за отличные ответы.Это моя рабочая конфигурация log4net и пример вывода.

Этот аппендер отвечает на любое сообщение ERROR, записывая контекстный «заголовок» в журнал.Журнал минимально заблокирован, чтобы позволить этому и буферизирующему приложению записывать в файл.Тег ignoresException, установленный на false, на самом деле сообщает log4net, что этот макет будет записывать исключение (вместо того, чтобы автоматически писать под сообщением).Но на самом деле я не хочу этого, это приходит в другом аппендиате.

<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>

Вывод этих аппендеров выглядит следующим образом

---------- 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()
2 голосов
/ 11 мая 2011

У меня есть решение, которое, вероятно, будет работать для вас, но это немного обходной путь.В основном, установите два приложения для записи в один и тот же файл.Когда вы пишете ошибку (которая приведет к очистке буфера в вашем файле журнала), попросите другого аппендера сначала написать текст «------- Ошибка --------» с новой строкой передtext.

Вам придется немного поиграть с этим, чтобы заставить его работать, но это должно быть работоспособным решением.Apache позволяет нескольким приложениям писать в один и тот же файл.Просто убедитесь, что вы добавили + MinimalLock на свои приложения, чтобы они не блокировали файл.Вот ссылка SO, которая объясняет, как два приложения могут записывать в один файл:

Может ли Log4net иметь несколько приложений для записи в один и тот же файл?

...