asp.net 核心上的 log4net

log4net on asp.net core

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

一切都在 MyProject 项目中,我只保留 web 用于声明。

我已将 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 时,项目 运行s。还有什么我在这里遗漏的吗?

您应该改为注入 strongly-typed 记录器:

public class ServiceA
{
    private readonly ILogger logger;

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

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

Get an ILogger object from DI.

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

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

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

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

A generic interface for logging where the category name is derived from the specified TCategoryName type name. Generally used to enable activation of a named ILogger from dependency injection.)