- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
NLog有logger.Fatal("Message", T object)等方法。
我脑子里有2个问题-
除了类型安全记录器之外,这些方法的目的是什么?
我们可以使用这种方法在运行时根据对象属性构造动态消息字符串吗?
我们想在运行时根据对象属性构造一条消息,以便 Nlog 可以反射(reflect)类型。这可能吗?
最佳答案
通用日志记录签名确实允许类型安全的日志记录。所以,你可以有这样的日志语句(假设 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 行中的对象还是上面 seconde 3 行中的格式和对象。
这意味着您可以在您的类型上实现 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 的示例,请参阅此问题:
关于c# - Nlog 泛型方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7950643/
我是一名优秀的程序员,十分优秀!