#enterprise-library
#enterprise-library
Вопрос:
Есть ли заранее определенный способ сделать это или нам нужно определить наш собственный форматировщик?
Ответ №1:
Вы не говорите, какую версию EntLib вы используете, но, учитывая дату вашего сообщения, я предполагаю, что EntLib 5.0.
Часть строки формата, которая вас заинтересует, это:
Extended Properties: {dictionary({key} - {value}{newline})}
Это часть общего шаблона форматирования «по умолчанию», найденного в вашем файле конфигурации, как показано ниже:
<formatters>
<add type="Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" template="Timestamp: {timestamp}{newline}amp;#xA;Message: {message}{newline}amp;#xA;Category: {category}{newline}amp;#xA;Priority: {priority}{newline}amp;#xA;EventId: {eventid}{newline}amp;#xA;Severity: {severity}{newline}amp;#xA;Title:{title}{newline}amp;#xA;Machine: {localMachine}{newline}amp;#xA;App Domain: {localAppDomain}{newline}amp;#xA;ProcessId: {localProcessId}{newline}amp;#xA;Process Name: {localProcessName}{newline}amp;#xA;Thread Name: {threadName}{newline}amp;#xA;Win32 ThreadId:{win32ThreadId}{newline}amp;#xA;Extended Properties: {dictionary({key} - {value}{newline})}" name="Text Formatter" />
</formatters>
Таким образом, вы можете видеть, что расширенные свойства — это словарь, который будет автоматически повторяться регистратором при создании записи журнала. Это предназначено для обеспечения быстрого и грязного способа сброса дополнительных выходных данных, которые может предоставить ваше приложение. Более полным способом для этого было бы написать пользовательский форматировщик, в котором специально есть токены для каждого из объектов, которые вы иначе добавили бы в расширенные свойства.
Чтобы получить свойства в эту коллекцию, просто используйте соответствующую перегрузку
LogWriter.Write(..)
метод при создании записи. Некоторые из них имеют
IDictionary(key, string) properties
параметр, который можно использовать для предоставления этих значений.
Что касается номера строки и имени метода, их можно просто вставить в словарь, который вы указали выше. Чтобы получить их значения, вы можете просто:
private void FillExtraLogInfo(IDictionary<string, object> info)
{
StackFrame stackFrame = new StackFrame(1, true);
info.Add("Method Name", stackFrame.GetMethod().ToString());
info.Add("Line Number" stackFrame.GetFileLineNumber());
}
Комментарии:
1. Стоит сказать, что получение стекового фрейма является очень дорогостоящей операцией, и трассировка стека, вероятно, будет неверной при использовании сборки выпуска с включенной оптимизацией, где методы были встроены компилятором JIT.
2. Неплохо. Примечание
stackFrame.ToString()
будет содержать имя файла, имя метода и номер строки в одной строке.
Ответ №2:
Вы можете получить имя метода, настроив свой TextFormatter в файле конфигурации. Я включил весь форматировщик, чтобы дать вам некоторый контекст, но главное, что нужно искать, это {property(methodName)} в атрибуте шаблона. Я не уверен, как получить номер строки.
<loggingConfiguration name="" tracingEnabled="true" defaultCategory="General">
<formatters>
<add type="Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
template="Timestamp: {timestamp}{newline}amp;#xA;Title: {title}{newline}amp;#xA;Message: {message}{newline}amp;#xA;Category: {category}{newline}amp;#xA;Priority: {priority}{newline}amp;#xA;EventId: {eventid}{newline}amp;#xA;Severity: {severity}{newline}amp;#xA;Machine: {localMachine}{newline}amp;#xA;App Domain: {localAppDomain}{newline}amp;#xA;ProcessId: {localProcessId}{newline}amp;#xA;Process Name: {localProcessName}{newline}amp;#xA;Thread Name: {threadName}{newline}amp;#xA;Win32 ThreadId:{win32ThreadId}{newline}amp;#xA;Extended Properties: {dictionary({key} - {value}{newline})}amp;#xA;Type: {property(TypeName)}{newline}amp;#xA;Method: {property(MethodName)}{newline}amp;#xA;Parameters: {dictionary({key} : {value};)}{newline}amp;#xA;Return Value: {property(ReturnValue)}{newline}amp;#xA;Call Time: {property(CallTime)}{newline}"
name="Detailed Text Formatter" />
</formatters>
</loggingConfiguration>
В статье MSDN о настройке форматеров упоминаются эти специальные токены, но, к сожалению, не очень хорошо объясняется, как их использовать.
Комментарии:
1. Это неправильно и не работает. средство
{property()}
форматирования используется для печати свойств объекта базового объекта LogEntry, таких какActivityId