Nlog универсальные методы - PullRequest
       11

Nlog универсальные методы

1 голос
/ 31 октября 2011

NLog имеет такие методы, как logger.Fatal («Сообщение», объект T) и т. Д.

У меня в голове 2 вопроса -

Какова цель этих методов, кроме безопасного регистратора типов?

Можем ли мы использовать этот метод для построения динамической строки сообщения во время выполнения на основе свойств объекта?

Мы хотим построить сообщение во время выполнения на основе свойств объекта, чтобы Nlog мог отражать тип. Возможно ли это?

1 Ответ

6 голосов
/ 31 октября 2011

Общие сигнатуры журналирования позволяют вести безопасную регистрацию. Таким образом, вы можете иметь такие лог-операторы (при условии, что logger - ваша переменная логирования):

int a;
string b;
SomeOtherTypeOfObject c;

logger.Info(a);
logger.Info(b);
logger.Info(c);

logger.Info("a = {0}", a);
logger.Info("b = {0}", b);
logger.Info("c = {0}", c);

Внутренне, NLog использует string.Format для преобразования переданного формата и объектов в строку. В случае общих сигнатур журналирования, которые принимают только объект, а не формат, внутренне NLog использует такой формат, как этот "{0}", поэтому коду форматирования сообщения, находящемуся дальше в NLog, не нужно знать, была ли строка формата прошло или нет.

В конечном итоге NLog вызывает ToString для объектов, которые передаются функциям журналирования NLog, будь то только объект, как в первых 3 строках выше, или формат и объект, как во 2-х строках выше.

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

Итак, предположим, что у вас есть следующий тип:

public class Person
{
  public Person(string name, DateTime birthday)
  {
    Name = name;
    Birthday = birthday;
  }

  public string Name { get; set; }
  public DateTime Birthday { get; set; }
  public int AgeInYears { get { return (DateTime.Now.Year - Birthday.Year); } }

  public override string ToString()
  {
    return string.Format("Person [{0}] Age [{1}]", Name, AgeInYears);
  }
}

Тогда вы можете войти в личность, как это:

Person p = new Person("Bob", new DateTime(1970, 1, 1));
logger.Info(p);

Или вот так:

Person p = GetPersonFromDatabase("Bob");
logger.Info("Person from database is {0}", p);

В обоих случаях, когда Person в конечном итоге оценивается NLog, используется метод ToString, поэтому вы получите что-то вроде этого для представления Person:

Person [Bob] Age [41]

В качестве альтернативы вы должны иметь возможность создать объект, единственная цель которого состоит в том, чтобы сгенерировать сообщение, основываясь на неких вычислениях:

public class MyLoggingParameters
{
  public string override ToString()
  {
    var x = GetSomeInformationFromSomewhere();

    return string.Format("MyLoggingParameters: [{0}], [{1}], [{2}]", x.Foo, x.Bar, x.Baz);
  }
}

var x = new MyLoggingParameters();

logger.Info(x);

Кроме того, не забывайте, что вы можете использовать различные объекты контекста для придания большего контекста вашим сообщениям регистрации:

NLog.GlobalDiagnosticContext["WhenDidMyApplicationStart"] = DateTime.Now;
NLog.ThreadDiagnosticContext["SomeThreadLocalValue"] = 1234;

Обратите внимание, что контекстные словари имеют тип Dictionary<string, string>, поэтому вы не можете сохранить объект в словаре и ожидать, что NLog вызовет ToString для объекта, когда придет время его зарегистрировать. Если вы хотите сохранить объект в контекстном словаре, вы фактически сохраняете снимок объекта.

Наконец, если у вас есть что-то специализированное, что вы хотите сделать, довольно легко написать свой собственный объект LayoutRenderer. LayoutRenderer получает структуру LogEventData в качестве входных данных, чтобы вы могли основывать свои выходные данные на содержимом этой структуры или на любых других данных, к которым вы знаете, как обращаться.

См. Этот вопрос для получения дополнительной информации об использовании NLog, включая пример пользовательского LayoutRenderer:

Самые полезные конфигурации NLog

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