Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 设计日志还是在之后添加日志? 在编写新的应用程序或基础设施时,您是否考虑从一开始就记录日志?例如,有很多类导入/使用ILogger接口(用于注入的构造函数内部)_.net_Logging - Fatal编程技术网

.net 设计日志还是在之后添加日志? 在编写新的应用程序或基础设施时,您是否考虑从一开始就记录日志?例如,有很多类导入/使用ILogger接口(用于注入的构造函数内部)

.net 设计日志还是在之后添加日志? 在编写新的应用程序或基础设施时,您是否考虑从一开始就记录日志?例如,有很多类导入/使用ILogger接口(用于注入的构造函数内部),.net,logging,.net,Logging,如果您已经准备好(大部分)应用程序,但没有考虑登录大部分或所有类,该怎么办。您最终会如何向它们添加日志记录 我关心的是,如果您需要深入到依赖链中进行日志记录,那么最终可能需要为许多类添加ILogger接口。为什么要让“许多”类实现ILogger?只要有一个或两个类来实现它就足够了,例如“DatabaseLogger”和“FileLogger”。需要传递ILogger实现的实例,没错,这可以通过单例或依赖项注入来完成。我通常使用单例类进行日志记录。这个类可以被配置为写入日志文件、数据库表或Wind

如果您已经准备好(大部分)应用程序,但没有考虑登录大部分或所有类,该怎么办。您最终会如何向它们添加日志记录


我关心的是,如果您需要深入到依赖链中进行日志记录,那么最终可能需要为许多类添加ILogger接口。

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

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

< P>我总是考虑从一开始就记录。 首先是决定使用哪个日志框架,但这通常是一个快速的选择。我个人经常使用log4net,这意味着每个类都使用静态LogManager.GetLogger来获取记录器的实例。然后在配置中定义每个日志调用的实际行为(我也应该在哪里记录,我应该在什么级别记录,等等)

然而,更重要的是,在实际开发应用程序时,您应该考虑什么需要日志记录。在编写代码时,您对代码的调优程度是最高的,而且您可能比其他任何时候都更清楚什么需要日志记录。回顾性地删除您不需要的过于冗长的日志记录要容易得多,添加应该存在的日志记录

所以,是的-在启动应用程序时,请始终考虑日志记录,如果可以的话,不要尝试重新安装它

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

可能最简单的方法(假设您没有使用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;
    }
}

我怀疑他指的不是工具,我怀疑他指的是导入或注入;很多类都注入了ILogger。我可能错了。当使用log4net时,在每个使用日志的类中实例化一个私有静态ILog实例是很常见的。通过这种方式,层次记录器名称反映了项目中使用的名称空间和类名的结构。我编辑了我的问题。通过依赖注入,你最终改变了很多类,让它们接受ILogger接口,对吗?因此,之后(在现有应用程序中)这样做会产生相当大的影响。使用单例似乎更好,但我听说单例有一些不好的地方,特别是在测试环境中。正如Rob指出的那样,在事后引入记录器总是一件痛苦的事情。您要么必须更改类以接受接口(它不需要在构造函数中,也可以是属性),要么向单例引入紧密耦合,这会使单元测试变得更困难,正如您正确提到的。单例对测试不好吗?你会怎么嘲笑它?或者您只是需要一个特殊的配置来进行测试?我想这取决于您的应用程序和体系结构。我通常尝试编写小而不是很复杂的方法。然后我将进行大量的单元测试,并在单元测试框架内进行日志记录。但我想在很多情况下,在进行单元测试时也可以使用单例类。静态类对测试来说不坏吗?你会怎么嘲笑它?或者你会在测试时有一个特殊的配置吗?@Rodi-你完全正确-事实上,为了简洁起见,我上面所说的是对我实际工作的简化。log4net中的logger本身是ILog类型,因此可以使用IoC模拟和注入,或者通过“延迟加载”属性访问,该属性仅在尚未提供模拟logger的情况下调用LogManager.GetLogger。您是否有一个示例或指向某个示例的链接?谢谢。我正计划使用一个IoC容器,所以我想你会依赖于它而忽略无参数构造函数吗?(您的编辑非常明显,不知道我还期待什么;)根据您的IoC,您可以省略无参数构造函数(如果它是“参数注入IoC”),也可以省略重载构造函数并具有公共记录器属性(用于属性注入),或者具有用于方法注入的公共“初始化”方法。