有关何时记录日志的好信息吗?我想在进入每个C#方法时记录INFO类型的日志,并在退出时记录另一个INFO。这是好还是坏?会对性能造成影响吗?
如果我在进入方法时记录INFO,那么想法是记录方法名称以及所有变量和值。
有什么办法可以自动完成这项工作,而不必输入每个值和方法名称?我想我可以使用反射,但也许我会看到慢下来的情况?
如果反射会减慢速度,也许我只能在程序失败时使用“REFLECTION”位,因此我可以编写堆栈跟踪、所有变量和值。
真的很感谢任何关于此的想法或示例。
谢谢
有关何时记录日志的好信息吗?我想在进入每个C#方法时记录INFO类型的日志,并在退出时记录另一个INFO。这是好还是坏?会对性能造成影响吗?
如果我在进入方法时记录INFO,那么想法是记录方法名称以及所有变量和值。
有什么办法可以自动完成这项工作,而不必输入每个值和方法名称?我想我可以使用反射,但也许我会看到慢下来的情况?
如果反射会减慢速度,也许我只能在程序失败时使用“REFLECTION”位,因此我可以编写堆栈跟踪、所有变量和值。
真的很感谢任何关于此的想法或示例。
谢谢
您可以使用AOP(面向切面编程)风格的日志记录来进行方法级别的日志记录。
有一个很好的框架叫做Log4PostSharp。它是PostSharp的一个插件,可以写入Log4Net。
基本上,您只需要在方法上添加一个类似于这样的属性:
[Log(LogLevel.Info, "Doing something")]
public void CountCharacters() {
// do your logic here
}
我会使用更低的级别来记录这个 - TRACE (如果在log4net中可用)。DEBUG适合记录特定事件,而TRACE更适合用于转储方法调用、参数和其他类似的内容。绝对不是INFO,它更适合记录更高级别的功能性内容。
我会使用DEBUG而不是INFO,并将INFO保留给您想要在生产中记录的内容。但这只是我的个人偏好。
这将会有性能损失。日志文件必须被写入,任何I/O都是性能问题。
我个人使用反射来处理类似的事情,但这也会对性能产生影响。您可能希望使用反射方法来实现前一个堆栈项并将其描述出来。然后您可以从任何地方调用它。
完成后,您可以运行分析器并优化真正导致性能问题的地方。
以下是我为PropertyChanged的处理方式。(请记住性能损失)
public string Name
{
get { return _Name ?? string.Empty; }
set
{
_Name = value;
NotifyPropertyChange(MethodBase.GetCurrentMethod());
}
}
private void NotifyPropertyChange(MemberInfo info)
{
NotifyPropertyChange(info.Name.Replace("set_", string.Empty));
}
private void NotifyPropertyChange(string property)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(property));
}