2015-08-17 3 views
0

Я пытаюсь понять, как правильно использовать Windows.Foundation.Diagnostics.LoggingChannel. В частности, я хотел бы понять цель, лежащую в основе свойства Level и когда это свойство установлено.Какова цель LoggingChannel.Level

Как указано в MSDN documentation от LoggingChannel, свойство Level доступно только для чтения. Итак, как я могу установить уровень, на который канал принимает сообщения?

В настоящее время, что я разработал в качестве регистратора для моего приложения является то, что, как показано ниже:

public class Logger 
{ 
    public LoggingLevel LoggerLoggingLevel { get; set; } 

    private LoggingSession _session; 
    private LoggingChannel _channel; 

    public Logger() 
    { 
     _channel = new LoggingChannel("MyChannel"); 
     _session = new LoggingSession("MySession"); 
     _session.AddLoggingChannel(_channel); 
    } 

    public void LogMessage(string msg, LoggingLevel level) 
    { 
     if (level >= LoggerLoggingLevel) 
     { 
      _channel.LogMessage(msg, level); 
     } 
    } 

    . 
    . 
    . 
} 

// The consumer of the Logger class will instantiate an instance of it, 
// sets the LoggerLoggingLevel, and then starts logging messages at various levels. 
// At any point, the consumer can change LoggerLoggingLevel to start accepting 
// messages at different levels. 

это правильный подход, или есть лучший способ (например, каким-то образом установив уровень _channel, а затем передавая сообщение & уровню на канал, позволяя каналу решить, следует ли отфильтровывать сообщение или принимать и регистрировать его)?

ответ

1

LoggingChannel.Level сообщает вам: «кто-то выразил заинтересованность в получении от вас сообщений, имеющих серьезность« Уровень »или выше». Это свойство будет автоматически установлено во время выполнения, когда кто-то подписывается на события из вашего экземпляра LoggingChannel. (В вашем приложении вы можете подписаться на события своего приложения, используя класс LoggingSession, вне вашего приложения вы можете записывать события своего приложения с помощью инструмента, такого как tracelog или xperf.)

В простых сценариях вам не нужно беспокоиться о ценности LoggingChannel.Level. Функция LoggingChannel.LogMessage уже проверяет значение LoggingChannel.Level. Он также проверяет значение LoggingChannel.Enabled, которое сообщает вам, подписывается ли кто-либо на ваши события на любом уровне. (Обратите внимание, что значение LoggingChannel.Level НЕ УКАЗАНО и БЕСПЛАТНО, если только LoggingChannel.Enabled не является истинным.) При нормальном использовании вам не нужно беспокоиться о LoggingChannel.Enabled или LoggingChannel.Level - просто вызовите LogMessage и позвольте LoggingChannel проверить уровней для вас.

LoggingChannel предоставляет свойства Enabled и Level для поддержки более сложного сценария, когда дорого собирать данные, которые вы собираетесь регистрировать. В этом случае вы, вероятно, захотите пропустить сбор данных, если никто не прослушивает ваше событие. Вы бы написать код так:

if (channel.Enabled && channel.Level <= eventLevel) 
{ 
    string expensiveData = GatherExpensiveData(); 
    channel.LogMessage(expensiveData, eventLevel); 
} 

Обратите внимание, что версия Windows, 10 из LoggingChannel добавили кучу новых методов, чтобы сделать жизнь немного легче. Если ваша программа будет работать на Windows 10 или более поздней версии, вы можете использовать метод IsEnabled вместо отдельных проверок на Enabled и Level:

if (channel.IsEnabled(eventLevel)) 
{ 
    string expensiveData = GatherExpensiveData(); 
    channel.LogMessage(expensiveData, eventLevel); 
} 

Куча других вещей также добавлена ​​LoggingChannel для Windows, 10. Теперь вы можете (строго типизированные поля), а не просто строки, вы можете определить ключевые слова и коды операций (посмотрите дополнительную документацию по ETW), и вы можете в основном заставить свой LoggingChannel действовать как первоклассный гражданин ETW.

Смежные вопросы