【问题标题】:Logger not showing in ASP.NET Core 2.1 Application记录器未在 ASP.NET Core 2.1 应用程序中显示
【发布时间】:2018-12-21 04:44:40
【问题描述】:

正如标题所说,当我使用dotnet run 运行应用程序时,为什么我的 Logger 没有显示在控制台中

不过,我在 Controller 以外的类中使用 Logger。

代码如下:

public class TestController : Controller
{
    private readonly ITestService service;
    public TestController(ITestService service)
    {
        this.service = service;
    }
}

public class TestService : ITestService
{
    private readonly ILogger logger;
    public TestService(ILogger<TestService> logger)
    {
        this.logger = logger;
    }

    public Task SomeFunction()
    {
        logger.Information("Do some function");
        return Task.CompleteTask;
    }
}

我正在为 ILogger 使用 Microsoft.Extensions.Logging

这是我在Startup.cs 中注册服务的方式:

services.Scan(scan => scan
    .FromAssemblyOf<ITestService>()
    .AddClasses(classes => classes
        .Where(t => t.Name.EndsWith("Service")))
    .AsImplementedInterfaces()
    .WithTransientLifetime());

我将Scrutor 用于Scan

这是我的Program.cs 的配置:

WebHost.CreateDefaultBuilder(args)
    .ConfigureServices(services => services.AddAutofac())
    .ConfigureAppConfiguration((context, builder) =>
    {
        builder.SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
            .AddJsonFile($"appsettings.{Environment.MachineName}.json", optional: true, reloadOnChange: true);
    })
    .ConfigureLogging((hostingContext, logging) =>
    {
        logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
        logging.AddConsole();
        logging.AddDebug();
    })
    .UseStartup<Startup>();

作为代码,我尝试使用logger.Information(""); 调用记录器,但记录器没有显示在我的控制台中。

我的代码有什么问题?

对不起我的英语。提前致谢

编辑:

差点忘了,这是我的appsettings.json

{
  "Logging": {
    "LogLevel": {
      "Default": "Debug",
      "System": "Information",
      "Microsoft": "Information"
    },
    "Console": {
      "IncludeScopes": "true"
    }
  },
  "AllowedHosts": "*"
}

【问题讨论】:

  • 对于Microsoft.Extensions.Logging,没有Information,有LogInformationTask.CompleteTask应该是Task.CompletedTask。我无法用LoggingCore 重现您的问题。是否有任何演示可以重现您的问题?

标签: c# logging asp.net-core


【解决方案1】:

关于在任何组件中使用日志记录:

您只是错过了 AddTransient。

这是对我有用的完整示例。

通过依赖注入请求ILoggerFactoryILogger&lt;T&gt; 来向应用程序中的组件添加日志记录。如果请求ILoggerFactory,则必须使用其CreateLogger 方法创建记录器。

如果您的CustomClass 是一个数据容器(DTO 类),它不应该知道日志记录,而只是包含数据。

对于其他名称如“Service”、“Provider”、“Handler”等的类,最佳实践是使用依赖注入来解析实例。通常,您应该尽可能使用 DI,因为它是一种实现对象与其协作者或依赖项之间松散耦合的技术。有关更多信息,以下问题可能会很有趣:Should I use Dependency Injection or static factories?

因此,只需将ILogger&lt;CustomClass&gt; 添加到其构造函数中(实际上与控制器相同),因为 .NET Core 默认仅支持构造函数注入:

public class CustomClass
{
    private readonly ILogger _logger;

    public CustomClass(ILogger<CustomClass> logger)
    {
        _logger = logger;
    }
}

ASP.NET Core 内置的依赖注入容器会自动解析瞬态依赖。因此,如果您的控制器将 A 类作为依赖项,该依赖项使用 B 类来记录您想要记录的内容,您的代码可以是这样的:

public class MyController
{
    public MyController(ClassA classA)
    { ... }
}

public class ClassA
{
    public ClassA(ClassB classB)
    { ... }
}

public class ClassB
{
    private readonly ILogger _logger;

    public ClassB(ILogger<ClassB> logger)
    {
        _logger = logger;
    }

    public void DoSomethingWithLogging()
    {
        // use _logger
    }
}

请注意,您还需要使用IServiceCollection.Add… 方法在Startup 中注册依赖项:

public void ConfigureServices(IServiceCollection services)
{
    // ...

    services.AddTransient<ClassB>();
    services.AddTransient<ClassA>();
}

内置日志记录支持意味着开箱即用的 .NET Core 知道并正在使用内置抽象进行日志记录。这主要由ILoggerFactoryILoggerProvider接口完成。

/// <summary>
/// Represents a type used to configure the logging system and create instances of <see cref="ILogger"/> from
/// the registered <see cref="ILoggerProvider"/>s.
/// </summary>
public interface ILoggerFactory : IDisposable

// <summary>
/// Represents a type that can create instances of <see cref="ILogger"/>.
/// </summary>
public interface ILoggerProvider : IDisposable

使用您自己的ILoggerProvider 实现,您可以添加自己的记录器,它可以做任何您想做的事情。您可以检查 NLog 记录器实现作为工作示例。

感谢ILoggerFactory,您可以简单地配置您的记录器以用于项目特定目的:

要在 ASP.NET Core 应用程序中配置日志记录,您应该在 Startup 类的 Configure 方法中解析 ILoggerFactory。当您将此类参数添加到Configure 方法时,ASP.NET Core 将使用依赖注入自动提供ILoggerFactory 的实例。

【讨论】:

  • 我不太了解 DI。所以我需要使用ServiceCollection 注册课程?我可以像注册我的服务一样使用Scrutor 注册它吗?
  • @itssolutionnow,您的答案不是提问者所要求的。我在提问者代码中没有发现任何问题。他在问为什么它没有显示在控制台中?
  • @TanvirArjel,我只是想说他只是忘记了这一点。 services.AddTransient();
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-14
  • 1970-01-01
  • 2020-03-14
  • 2020-10-03
  • 2023-04-08
  • 2019-02-26
相关资源
最近更新 更多