Nlog и пользовательские уровни - PullRequest
8 голосов
/ 20 февраля 2011

я знаю, что в NLog встроены некоторые уровни журналов, такие как trace, info, fatal и т. Д.

Я хочу определить некоторые новые, такие как «DBLog», и иметь возможность настроить только все журналы с DBlog, чтобы они были нацелены на определенную цель.

есть ли способ сделать это? или я должен определить пользовательский журнал?

Ответы [ 2 ]

22 голосов
/ 21 февраля 2011

@ SemVanmeenen прав, NLog не позволяет добавлять пользовательские уровни (то есть расширять возможные значения в классе LogLevel). Кроме того, учитывая то, как работают уровни, по крайней мере, в NLog, каждый уровень обычно указывает приоритет сообщения. Таким образом, если у вас есть некоторые (или все) средства ведения журнала, настроенные на запись только сообщений об ошибках и сообщениях более высокого уровня, любые сообщения Trace, Debug, Info и Warn не будут регистрироваться. Где подойдет уровень DBLog? Похоже, что это будет больше «категория» (которая может быть несколько аналогична именам регистратора), а не уровень.

Вам действительно нужен специальный уровень (или более одного), чтобы регистрировать такие вещи, как "DBLog"? Почему бы просто не определить другой регистратор в вашем конфигурационном файле под названием «DBLog»? Таким образом, вы можете использовать фильтрацию и Targets для отправки этих журналов в определенную Target или для включения или выключения этого регистратора. См. Эту ссылку для некоторых примеров того, что вы можете сделать с конфигурацией NLog.

Одним из наиболее распространенных шаблонов в NLog и log4net является наличие регистратора для каждого класса, например:

class MyClass
{
  private static readonly Logger logger = LogManager.GetCurrentClassLogger();

  public void DoSomething(int x, int y);
  {
    logger.Info("Doing something.  x = {0}, y = {1}", x, y);

    //Or

    logger.Log(LogLevel.Info, "Doing something. x = {0}, y = {1}", x, y);
  }
}

Вы также можете использовать произвольные имена регистраторов:

class MyDbClass
{
  private static readonly Logger logger = LogManager.GetLogger("DbStuff");

  public void DoSomething(int x, int y);
  {
    logger.Info("Doing something.  x = {0}, y = {1}", x, y);

    //Or

    logger.Log(LogLevel.Info, "Doing something. x = {0}, y = {1}", x, y);
  }
}

class MyOtherDbClass
{
  private static readonly Logger logger = LogManager.GetLogger("DbStuff");

  public void DoSomething(int x, int y);
  {
    logger.Info("Doing something.  x = {0}, y = {1}", x, y);

    //Or

    logger.Log(LogLevel.Info, "Doing something. x = {0}, y = {1}", x, y);
  }
}

Во втором примере оба класса используют один и тот же регистратор («DbStuff»), и обоими можно управлять (уровень ведения журнала, цель и т. Д.) На основе этого имени регистратора.

Вы также можете использовать разные регистраторы в одном и том же классе (возможно, по умолчанию вы используете стиль регистратора «на класс», но вы также определяете некоторые «сквозные» регистраторы, чтобы было проще регистрировать и контролировать - похожую информацию по всему классы). Возможно, у вас есть регистратор с именем «SQL» или «PERFORMANCE», который вы иногда используете для регистрации конкретной информации, которой вы хотели бы управлять на уровне, отличном от уровня класса.

Используя разные имена регистраторов, вы, безусловно, можете направлять сообщения регистрации в разные цели без определения новых уровней журнала.

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

[ОБНОВЛЕНИЕ] * * тысяча двадцать один

<logger name="Name.Space.Class1" minlevel="Debug" writeTo="f1" />  
<logger name="Name.Space.Class1" levels="Debug,Error" writeTo="f1" />  
<logger name="Name.Space.*" writeTo="f3,f4" /> 
<logger name="Name.Space.*" minlevel="Warn" writeTo="f3,f4" /> 
<logger name="Name.Space.*" minlevel="Debug" maxlevel="Error" final="true" />

Предположим, что f1, f2, f3 и f4 являются целевыми объектами файла.

Строка 1 заставит регистратор для Class1 записывать в цель f1 для сообщений отладки и сообщений более высокого уровня (т. Е. Трассировка будет пропущена).

Строка 2 приведет к тому, что регистратор для Class1 будет писать ТОЛЬКО для цели f1 ТОЛЬКО сообщения об уровне отладки и ошибки (то есть трассировка, информация, предупреждение и фатальная ошибка будут пропущены)

Строка 3 приведет к тому, что регистраторы для всех классов в пространстве имен Name.Space будут записывать в целевые объекты f3 и f4 независимо от уровня.

Строка 4 приведет к тому, что регистраторы для всех классов в пространстве имен Name.Space будут записывать в целевые объекты f3 и f4 только в том случае, если уровень журнала равен Warn или выше (т. Е. Трассировка, отладка и информация будут пропущены)

Строка 5 приведет к тому, что регистраторы для всех классов в пространстве имен Name.Space отклонят любые сообщения, уровень которых находится между Debug и Error. Они отклонены, потому что нет предложения writeTo. Дальнейшие правила для регистраторов не обрабатываются из-за final=true

Эти примеры показывают, как фильтровать на уровне регистратора. Вы можете выполнить дальнейшую фильтрацию на целевом уровне, используя FilteringTargetWrapper. Я не использовал его, но здесь есть пример настройки FilteringTargetWrapper:
Самые полезные конфигурации NLog

Я получил эти примеры из файла справки, поставляемого с установкой обновления NLog 1.0. Я еще не установил NLog 2.0, потому что я нахожусь в середине проекта и предпочитаю дождаться выхода бета-версии NLog 2.0, прежде чем перейти к нему. Если вы используете NLog 2.0 и файл справки не имеет лучших примеров, чем на веб-сайте NLog, вы можете рассмотреть установку хотя бы справки NLog 1.0. Вы можете получить помощь по NLog 1.0 здесь: http://nlog.codeplex.com/releases/view/32601

0 голосов
/ 20 февраля 2011

Насколько я знаю, невозможно. Класс уровня журнала в nlog даже не имеет публичного конструктора и имеет только предопределенные статические объекты уровня логирования (т. Е. Обычную информацию, трассировку и т. Д.).

Но есть ли причина, почемуодной цели недостаточно?

...