Недавно я написал библиотеку журналов, которая использует интерфейс IDisposable для переноса областей в контекст журналирования. По сути, есть одноразовый объект LogSite, который вы используете следующим образом:
using(var logger = new LogSite("methodName", new object[] { p1, p2, p3 })
{
// code that does stuff goes here
}
Объект LogSite имеет несколько удобных перегрузок для конструктора, таких как MethodBase, поэтому вы можете просто использовать MethodBase.GetCurrentMethod () и использовать отражение, чтобы получить фактическое имя метода и параметров (вместо жестко закодированных строк). ,
Вот как это работает - в конструкторе он записывает в журнал всю информацию трассировки, чтобы указать, что он вошел в блок. В методе Dispose он записывает запись о выходе.
При утилизации он также проверяет Marshal.GetExceptionCode () на ненулевое значение, чтобы увидеть, выдал ли код внутри объекта исключение или нормально завершился. Это не дает вам исключения, так что это должно будет быть явно зарегистрировано в обработчике перехвата, но это указывает «пройти / не пройти» для этого региона. Это позволяет вашей области ведения журнала быть более конкретным, чем просто метод, поскольку вы можете иметь множество этих блоков в одном методе и точно знать, какой из них выдает исключение.
Кроме того, поскольку теперь доступен объект "logger", ваш обработчик catch выглядит так:
try { ... }
catch (Exception ex)
{
logger.LogException(ex);
}
Регистратор уже знает имя метода, информацию о параметрах и все такое и имеет внутренние методы для форматирования информации об исключении.
Попав в архитектуру ниже этого высокоуровневого объекта, есть концепция «LogDisposition», которая обрабатывает «проход / неудача», которую мы определили ранее, и есть концепция «LogEntryType», которая представляет собой фильтр (реализованный с помощью перечисления Flags ), который указывает, какой тип записи журнала передается (ошибка, трассировка и т. д.).
То, что фактически делает ведение журнала, это просто шаблон издателя / слушателя. Издатель принимает переданную в журнале запись и во многом похож на многоадресного делегата, ведет реестр экземпляров LogListener (должен быть установлен в начале программы или добавляется динамически по мере необходимости) и передает запись журнала в эти экземпляры. ,
LogListeners, в свою очередь, отфильтровывают, какие записи журнала им нужны. Так что, если вы не хотите, чтобы точки входа и выхода метода находились в условиях отсутствия ошибок, они не должны отображаться в журнале. , Это можно контролировать во время выполнения, чтобы пользователь мог по своему усмотрению включать и выключать детальную регистрацию. Поскольку издатель может выполнять запись в различные списки журналирования, вы можете подключить что-либо, что записывает в файл или записывает в базу данных, или отображает уведомления об ошибках в графическом интерфейсе ... и т. Д.
Это довольно хорошая система и требует относительно небольшого количества кода для получения относительно богатых журналов.
Я мог бы дать вам пример кода, если вы хотите ... Вы можете связаться со мной через мой (почти полностью неактивный) блог (см. Мой профиль учетной записи).
Надеюсь, это поможет.