Общие сигнатуры журналирования позволяют вести безопасную регистрацию. Таким образом, вы можете иметь такие лог-операторы (при условии, что 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