之后是否记录或添加日志记录的设计?

时间:2011-03-30 10:28:12

标签: .net logging

在编写新的应用程序或基础架构时,您是否考虑从一开始就进行日志记录?因此有很多类导入/使用ILogger接口(用于注入的构造函数内部),例如?

如果您已经(大部分)已经安装了应用程序,但是没有考虑登录大部分或全部课程,那该怎么办?您最终会如何向他们添加日志记录?

我之后添加的问题是,如果您需要深入到依赖关系链中,最终可能需要在许多类中添加ILogger接口。

3 个答案:

答案 0 :(得分:6)

我总是考虑从一开始就记录。

首先,决定使用哪种日志框架,但这通常是一种快速选择。我个人经常使用log4net,这意味着每个类使用静态LogManager.GetLogger来获取记录器的实例。然后在config中定义每个日志调用的实际行为(我应该在哪里记录,我应该在哪个级别登录等)。

但是,更重要的是,在实际开发应用程序时,您应该考虑需要记录的内容。没有必要比你编写代码更多地调整你的代码了,而且你可能比其他任何时候都更了解需要记录的内容。回溯性地删除那些不需要添加应该存在的日志记录的过于冗长的日志记录要容易得多。

所以是的 - 在您启动应用程序时始终考虑记录日志,如果您能提供帮助,请不要尝试改编它。

[编辑:回答您关于如何注射的问题]

可能最简单的方法(假设您没有使用IoC容器)是沿着属性路径或构造函数注入。就个人而言,我更喜欢后者这种东西,所以我最终会得到类似log4net的东西:

public class MyClass
{
    private readonly ILog _logger;

    // usually I don't supply a logger directly, 
    // hence I let this ctor get a logger from the log manager.
    public MyClass() : this (LogManager.GetLogger(typeof(MyClass)))
    {

    }

    // this ctor only gets called directly if I want to mock out logging
    public MyClass(ILog logger)
    {
        _logger = logger;
    }
}

答案 1 :(得分:1)

为什么你会有“很多”类实现ILogger?只要一个或两个类实现它就足够了,例如“DatabaseLogger”和“FileLogger”。需要传递ILogger实现的一个实例,这是正确的,这可以通过单例或依赖注入来完成。

答案 2 :(得分:0)

我通常使用单例类进行日志记录。可以将此类配置为写入日志文件,数据库表或Windows事件日志。