【问题标题】:log4net on asp.net core在 asp.net 核心上的 log4net
【发布时间】:2019-05-13 08:43:42
【问题描述】:

我有一个 asp.net core 2.2 解决方案。结构看起来像 我的项目 我的项目.Web

一切都在 MyProject 项目中,我只保留网络以供声明。

我已将 Microsoft.Extensions.Logging.Log4Net.AspNetCore 引用添加到 MyProject.Web 我在 Startup.cs 中添加了loggerFactory.AddLog4Net();。我还在 MyProject.Web 中添加了 log4net.config 并设置为Always Copy。 我在 MyProject 项目中有一项服务调用 ServiceA

public class ServiceA
    {
        private readonly ILogger logger;

        public ServiceA(ILogger logger)
        {
            this.logger = logger;
        }
    }

但是,当我运行该解决方案时,它会因错误 HTTP Error 500.30 - ANCM In-Process Start Failure 而崩溃。 当我从 ServiceA 的构造函数中删除 ILogger 时,项目运行。还有什么我在这里遗漏的吗?

【问题讨论】:

  • 如果你使用依赖注入,你应该接受ILogger<ServiceA>作为参数,而不是ILogger。否则 DI 容器将尝试创建一个 ILogger 实例。
  • 你试过调试你的代码吗?你得到了什么例外?我曾多次犯过同样的错误,但我不记得异常是什么。我认为是 DI 容器找不到 ILogger 实例。这是有道理的,因为扩展自己注册了一个强类型工厂

标签: c# .net asp.net-core log4net


【解决方案1】:

你应该注入一个强类型的记录器:

public class ServiceA
{
    private readonly ILogger logger;

    public ServiceA(ILogger<ServiceA> logger)
    {
        this.logger = logger;
    }
}

这是the documentation too 中显示的简单场景。文档显示目标类型用作记录器的类别名称:

从 DI 中获取 ILogger 对象。

使用控制器的类型名称作为

我不时犯同样的错误,但我不记得例外是什么。如果我没记错的话,就是 DI 容器找不到 ILogger 实例。这是有道理的,因为扩展名register a strongly typed logger。 AddLogging 的源代码包含这一行:

services.TryAdd(ServiceDescriptor.Singleton(typeof(ILogger<>), typeof(Logger<>)));

正如ILogger< TCategoryName> 文档解释的那样,这用于基于类型名称而不是字符串创建命名记录器:

用于记录的通用接口,其中类别名称派生自指定的 TCategoryName 类型名称。通常用于启用从依赖注入中激活命名ILogger。)

【讨论】:

  • 这是正确答案。我没有在记录器中注入 T。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-23
  • 1970-01-01
  • 2017-11-24
  • 2017-04-30
相关资源
最近更新 更多