Ведение журнала корпоративной библиотеки: как печатать имя метода и номер строки с каждой записью журнала.

#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