Как зарегистрировать сообщение, когда BufferingForwardingAppender сброшен?
У меня есть 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="logsErrors.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 ответов:
У меня есть решение, которое, вероятно, будет работать для вас, но это немного обходной путь. В принципе, установите два приложения для записи в один и тот же файл. Когда вы пишете сообщение об ошибке (которое приведет к тому, что буфер очистится в файле журнала), попросите другого аппендера сначала записать текст "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - " с новой строкой перед текстом.
Вам придется немного поиграть с ним, чтобы заставить его работать, но это должно быть работоспособное решение. Апач не допускает несколько аппендеры написать тот же файл. Просто убедитесь, что вы поставить +MinimalLock на свои аппендеры, чтобы они не заблокировать файл. Вот ссылка SO, которая объясняет, как два приложения могут писать в один и тот же файл:
Может ли Log4net иметь несколько приложений для записи в один и тот же файл?
Спасибо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()
Comments