log4net何时记录日志?

3

有关何时记录日志的好信息吗?我想在进入每个C#方法时记录INFO类型的日志,并在退出时记录另一个INFO。这是好还是坏?会对性能造成影响吗?

如果我在进入方法时记录INFO,那么想法是记录方法名称以及所有变量和值。

有什么办法可以自动完成这项工作,而不必输入每个值和方法名称?我想我可以使用反射,但也许我会看到慢下来的情况?

如果反射会减慢速度,也许我只能在程序失败时使用“REFLECTION”位,因此我可以编写堆栈跟踪、所有变量和值。

真的很感谢任何关于此的想法或示例。

谢谢

3个回答

6

您可以使用AOP(面向切面编程)风格的日志记录来进行方法级别的日志记录。

有一个很好的框架叫做Log4PostSharp。它是PostSharp的一个插件,可以写入Log4Net。

基本上,您只需要在方法上添加一个类似于这样的属性:

[Log(LogLevel.Info, "Doing something")]
public void CountCharacters() {
   // do your logic here
}

不知道这个..我喜欢它。你甚至可以编写自己的属性来完成相同的事情。+1 - John Weldon

2

我会使用更低的级别来记录这个 - TRACE (如果在log4net中可用)。DEBUG适合记录特定事件,而TRACE更适合用于转储方法调用、参数和其他类似的内容。绝对不是INFO,它更适合记录更高级别的功能性内容。


1

我会使用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));
    }

使用调试功能几乎可以解决所有问题,这样当您将应用程序部署到生产环境时,可以轻松地将其降低到最少的信息量,并处理应用程序生成的任何警告和错误。 - Michael Haren

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接