Ведение журнала корпоративной библиотеки - как получить настроенный уровень ведения журнала во время выполнения? - PullRequest
4 голосов
/ 18 мая 2011

Мы используем Enterprise Library 4.1 для ведения журнала (и обработки исключений / криптографии).

Кто-нибудь знает хороший способ определения настроенного уровня ведения журнала во время выполнения?Я написал класс LogUtility для выполнения вызовов журналирования и вызываю его в соответствии с этим примером:

LogUtility.LogVerbose(
    string.Format("Processing event {0}", currentEvent.EventIDImported), 
    MethodBase.GetCurrentMethod().Name, 
    this.GetType().Name
);

Я понимаю, что на самом деле он не будет зарегистрирован в файл, если не установлен уровень ведения журналадо соответствующего уровня, в app.config в моем случае.Но я на самом деле не хочу, чтобы параметры метода, то есть имена методов и типов, а в некоторых случаях и записываемые в журнал реальные строки, оценивались без крайней необходимости.

Похоже ли это на действительную проблему?Наше приложение может иметь десятки миллионов итераций и точек регистрации.Если возможно, я бы хотел установить флаг на основе настроенного уровня журнала и проверить это перед выполнением вызова метода выше.

РЕДАКТИРОВАТЬ - я думаю, что в приведенном выше примере я мог бы жестко кодировать метод ивведите имена при каждом вызове.Но я все еще хотел бы знать, есть ли способ определения уровня.

Ответы [ 2 ]

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

Я не очень хочу метод параметры, то есть метод и тип имена, а в некоторых случаях фактические записываемые строки, подлежащие оценке если это абсолютно необходимо.

Исходя из вышеизложенного, я думаю, вам стоит взглянуть на ShouldLog метод LogWriter. Это позволит вам определить, будет ли LogEntry регистрироваться на основе текущей конфигурации, и вы можете (надеюсь) избежать создания ненужных объектов.

Для заимствования кода из библиотеки предприятия 4.1 Пошаговое руководство. Проверка состояния фильтра перед построением сообщений журнала :

LogEntry logEntry = new LogEntry();
logEntry.Priority = 2;
logEntry.Categories.Add("Trace");
logEntry.Categories.Add("UI Events");

if (Logger.ShouldLog(logEntry))
{
  // Perform operations (possibly expensive) to gather additional information 
  // for the event to be logged. 
}
else
{
  // Event will not be logged. Your application can avoid the performance
  // penalty of collecting information for an event that will not be
  // logged.
}

Поскольку вы используете свой собственный класс LogUtility, вы, вероятно, захотите создать статическое свойство в LogUtility с именем ShouldLogVerbose или IsVerboseEnabled, а внутри этого свойства использовать "правильно" сконструированный LogEntry ваше заявление), чтобы определить, будет ли сообщение будет зарегистрировано. например, * * 1 022

if (LogUtility.IsVerboseEnabled)
{
    LogUtility.LogVerbose(
        string.Format("Processing event {0}", currentEvent.EventIDImported), 
        MethodBase.GetCurrentMethod().Name, 
        this.GetType().Name
    );
}
1 голос
/ 18 мая 2011

Для данной категории вы можете сделать следующее:

logWriter.TraceSources["category"].Level

См. http://msdn.microsoft.com/en-us/library/microsoft.practices.enterpriselibrary.logging.logsource_members.aspx

...