首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ASP.NET Core2.1应用程序中未显示的记录器

ASP.NET Core2.1应用程序中未显示的记录器
EN

Stack Overflow用户
提问于 2018-12-21 04:44:40
回答 1查看 4.3K关注 0票数 3

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

不过,我在课堂上使用的是Logger,而不是Controller。

下面是代码:

代码语言:javascript
复制
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;
    }
}

我用Microsoft.Extensions.Logging做ILogger

下面是我如何在Startup.cs中注册我的服务

代码语言:javascript
复制
services.Scan(scan => scan
    .FromAssemblyOf<ITestService>()
    .AddClasses(classes => classes
        .Where(t => t.Name.EndsWith("Service")))
    .AsImplementedInterfaces()
    .WithTransientLifetime());

我用ScrutorScan

这是我的Program.cs配置

代码语言:javascript
复制
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

代码语言:javascript
复制
{
  "Logging": {
    "LogLevel": {
      "Default": "Debug",
      "System": "Information",
      "Microsoft": "Information"
    },
    "Console": {
      "IncludeScopes": "true"
    }
  },
  "AllowedHosts": "*"
}
EN

回答 1

Stack Overflow用户

发布于 2018-12-21 04:55:57

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

你刚刚错过了AddTransient。

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

将日志添加到应用程序中的组件是通过通过依赖注入请求ILoggerFactoryILogger<T>来完成的。如果请求ILoggerFactory,则必须使用其CreateLogger方法创建记录器。

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

对于其他名称为"Service“、"Provider”、"Handler“等的类,最佳实践是使用依赖注入解析实例。通常,只要有可能,就应该使用DI,因为它是实现对象及其协作者或依赖项之间的松散耦合的一种技术。有关更多信息,以下问题可能很有趣:我应该使用依赖注入还是静态工厂?

因此,只需将ILogger<CustomClass>添加到其构造函数中(实际上与控制器的方式相同),因为.NET Core默认只支持构造函数注入:

代码语言:javascript
复制
public class CustomClass
{
    private readonly ILogger _logger;

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

ASP.NET核心的内置依赖注入容器将自动解决瞬态依赖关系。因此,如果控制器将类A作为一个依赖项,它使用类B来记录某项内容,那么您的代码可以如下所示:

代码语言:javascript
复制
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
    }
}

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

代码语言:javascript
复制
public void ConfigureServices(IServiceCollection services)
{
    // ...

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

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

代码语言:javascript
复制
/// <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,您可以简单地为特定于项目的目的配置Logger:

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53879275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档