Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.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
Exception handling ASP.NET 5在层中记录异常的最佳实践_Exception Handling_Asp.net Core_Asp.net Core Mvc_Serilog - Fatal编程技术网

Exception handling ASP.NET 5在层中记录异常的最佳实践

Exception handling ASP.NET 5在层中记录异常的最佳实践,exception-handling,asp.net-core,asp.net-core-mvc,serilog,Exception Handling,Asp.net Core,Asp.net Core Mvc,Serilog,我有一个使用ASP.NET5和MVC6的项目。我有几个层次: 我的演示层 我的域模型层 我的基础架构层 我的业务逻辑层 和我的数据访问层 目前,我使用依赖项注入在控制器方法中记录异常 private readonly ILogger<CustomerController> _logger; public CustomerController(ILogger<CustomerController> logger) { _logger = logger; }

我有一个使用ASP.NET5和MVC6的项目。我有几个层次:

  • 我的演示层
  • 我的域模型层
  • 我的基础架构层
  • 我的业务逻辑层
  • 和我的数据访问层
目前,我使用依赖项注入在控制器方法中记录异常

private readonly ILogger<CustomerController> _logger;
public CustomerController(ILogger<CustomerController> logger)
{
     _logger = logger;
}

public bool TestLog()
{
     _logger.LogError((int)LoggingEvents.LIST_ITEMS, "Test info #543434");
     return true;
}
专用只读ILogger\u记录器;
公共客户控制器(ILogger记录器)
{
_记录器=记录器;
}
公共bool测试日志()
{
_logger.LogError((int)LoggingEvents.LIST_项,“测试信息”543434);
返回true;
}

在我的其他层(如我的数据访问层)中使用记录器的最佳实践是什么?

如果您想记录未处理的异常,您可能应该添加一个中间件来处理该异常。您可以在这个SO答案中看到一个示例:

最佳实践是为每个组件注入自己的记录器,并让每个组件都做自己的日志记录

如果您认为这对您的应用程序来说太过嘈杂,那么您可以更改命名空间部分的详细级别,以便您只获得控制器的
信息
级别日志,以及其他所有内容的
警告
(或更糟):

loggerFactory.AddConsole(new ConsoleLoggerSettings()
{
    Switches = new Dictionary<string, LogLevel>()
    {
        ["MyNamespace.Services"] = LogLevel.Warning,
        ["MyNamsepace.Controllers"] = LogLevel.Information
    }
});
loggerFactory.AddConsole(新的ConsoleLogger设置()
{
开关=新字典()
{
[“MyNamespace.Services”]=LogLevel.Warning,
[“MyNamsepace.Controllers”]=LogLevel.Information
}
});

最好仅在应用程序层(控制器、应用程序服务,但不包括域服务)中使用
ILogger

如果您想在域服务/存储库中添加日志记录,最好为其创建装饰器。只有将接口从其实现中抽象出来,并在任何地方使用/注入接口时,这才有效)

但是,对装饰器的使用有一些限制。您可以在调用公共接口中定义的方法之前和之后进行日志记录。不在电话里

为什么要避免将记录器记录/注入服务? 耦合 您应该避免在域对象中注入
ILogger
,因为这会将域与ASP.NET核心日志框架/基类相耦合。但是,您始终可以定义自己的记录器接口,以便在您的域中使用它,并将其作为
ILogger
的包装器实现

坚实的原则 SS中,OLID原则代表SRP(单一责任原则),并表示一个对象应该只有一个责任。在一个对象中进行日志记录、持久化或业务逻辑违反了这一原则


但最终,你必须权衡开发成本和由此获得的收益。如果它是一个长期存在的应用程序(将在未来10年左右使用)和一个复杂的应用程序,那么登录为decorators肯定是有意义的。如果这是一个只有几周开发时间的小项目,那么这种抽象的好处可能不会超过成本。

“因为它将您的域与ASP.NET核心日志记录框架/基类相结合”–ASP.NET核心中包含的ILogger接口已经非常通用,并且对其他实现开放;这里真的没有太多的耦合。它也在扩展名称空间(不是ASP.NET)中,所以它是一个单独的实体,实际上被认为是直接改编成.NET内核的。@poke:是的,但是如果接口要更改,它会破坏整个域。当您有自己的接口时,只有在您修改它时它才会中断。如果.NET核心记录器接口发生更改,则只有围绕它的包装器/提供程序会失败,这不是问题,因为它是基础架构,并且不在您的域内。但这取决于公司/开发人员来决定由谁来推动抽象:我不知道为什么有人对此投了反对票?我认为,假设依赖注入也将在其他层中使用,这可能会改进答案。