Неправильное форматирование блока журналирования Microsoft Enterprise Library
Мы используем MS Enterprise Library 5.0 Logging на нашем веб-сайте.
И когда исключение остается необработанным, мы хотели бы зарегистрировать его вместе с частью контекстной информации, чтобы помочь в отладке проблемы. Итак, у нас есть HttpModule
который находится на веб-сайте, и чья работа заключается в том, чтобы перехватывать их и записывать в журнал событий приложений Windows. Это все довольно ванильные вещи.
И это работает... на наших производственных веб-серверах. Он не работает должным образом на наших тестовых веб-серверах.
Проблема в том, что LogEvent.ExtendedProperties
Коллекция не отображается должным образом (или вообще). Вместо этого заменяющие токены просто выгружаются дословно в журнал событий.
Журналы производственных событий показывают информацию, подобную этой (немного сокращенно), со всем форматированным так, как вы ожидаете:
12/10/2013 06:07:13 PM
LogName=Application
SourceName=Secure Website
EventCode=1729
EventType=2
Type=Error
ComputerName=WSSECURE09.website.nordstrom.com
TaskCategory=%1
OpCode=Info
RecordNumber=220338
Keywords=Classic
Message=Message: Unhandled exception in Secure Website: System.ServiceModel.FaultException`1[Nordstrom.Contracts.Fault.ServiceFault]:
Argument shopper is invalid.
Email is null or empty.
(Fault Detail is equal to Error code: InvalidArguments).
.
.
.
Extended Properties: Shopper ID - XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
где последняя строка (и) (Extended Properties: ...
) сбрось ExtendedProperties
собрать и дать идентификатор покупателя, который столкнулся с проблемой, чтобы помочь в ее устранении. В наших тестовых средах коллекция расширенных свойств вообще не сбрасывается. Вместо этого необработанные токены из шаблона записываются дословно, без подстановок:
Extended Properties: {key} - {value}
)}
Вот используемый шаблон форматирования прямо из файла web.config. Я добавил разрывы строк для удобства чтения, но это единственное изменение:
<formatters>
<add type="Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter, Microsoft.Practices.EnterpriseLibrary.Logging"
template="
Message: {message}

Category: {category}

Priority: {priority}

EventId: {eventid}

Severity: {severity}

Title:{title}

Machine: {machine}

Application Domain: {appDomain}

Process Id: {processId}

Process Name: {processName}

Win32 Thread Id: {win32ThreadId}

Thread Name: {threadName}

Extended Properties: {dictionary({key} - {value}
)}
"
name="Text Formatter"
/>
</formatters>
А вот [слегка продезинфицированный] код регистрации:
private static void LogHandledException( Exception ex )
{
HttpContext context = HttpContext.Current ;
LogEntry entry = new LogEntry() ;
entry.Categories.Add("Errors");
entry.Priority = 1;
entry.Severity = TraceEventType.Critical;
entry.Message = string.Format( "Unhandled exception in Secure Website: {0}" , ex ) ;
entry.EventId = (int) EventId.UnhandledException ;
// Add shopper id to the log, if we can find it in the http context
Shopper shopper = HttpContext.Current.Items[ "shopper" ] as Shopper ;
if ( shopper != null )
{
bool hasShopperId = ! string.IsNullOrWhiteSpace( shopper.Id ) ;
if ( hasShopperId )
{
KeyValuePair<string,object> item = new KeyValuePair<string,object>("ShopperID",shopper.Id) ;
entry.ExtendedProperties.Add( item ) ;
}
}
Logger.Write(entry);
return ;
}
1 ответ
Выяснилось, что наша команда управления конфигурацией разработала собственный инструмент для преобразования файлов конфигурации:
- http://www.hanselman.com/blog/SlowCheetahWebconfigTransformationSyntaxNowGeneralizedForAnyXMLConfigurationFile.aspx
- http://msdn.microsoft.com/en-us/library/dd465326(v=vs.110).aspx
- http://msdn.microsoft.com/en-us/library/dd465318(v=vs.100).aspx
Парсер этого инструмента был явно... неправильно написан. Вложенные фигурные скобки, казалось, запутали это. Почему он будет анализироваться внутри строкового литерала или почему он будет работать правильно для преобразований нашей производственной среды, а не для преобразований любой другой среды, я понятия не имею, но команда CM исправила их инструмент. И вуаля! Задача решена.
Мне не приходило в голову, что наши инструменты сборки будут сломаны (или что мы свернули бы свои собственные средства для чего-то довольно стандартного, с инструментами, доступными для выполнения работы), но однажды я исключил наш код и принял решение Из-за различий в конфигурации на разных серверах, это не оставляло много места для чего-либо еще. Как сказал Шерлок Холмс,
"Как часто я говорил вам, что когда вы устраняете невозможное, все, что остается, каким бы невероятным оно ни было, должно быть правдой? Мы знаем, что он не заходил через дверь, окно или дымоход. Мы также знаем, что он не мог быть скрыт в комнате, так как невозможно скрыть. Когда же он пришел?"
- Шерлок Холмс в "Знаке четырех" сэра Артура Конан Дойля