如标题所示,当我使用dotnet run运行应用程序时,为什么我的日志没有显示在控制台中?
不过,我在课堂上使用的是Logger,而不是Controller。
下面是代码:
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中注册我的服务
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": "*"
}发布于 2018-12-21 04:55:57
关于在任何组件中使用日志记录:
你刚刚错过了AddTransient。
这是对我有用的完整例子。
将日志添加到应用程序中的组件是通过通过依赖注入请求
ILoggerFactory或ILogger<T>来完成的。如果请求ILoggerFactory,则必须使用其CreateLogger方法创建记录器。
如果您的CustomClass是一个数据容器(DTO类),那么它不应该知道日志记录,而应该只包含数据。
对于其他名称为"Service“、"Provider”、"Handler“等的类,最佳实践是使用依赖注入解析实例。通常,只要有可能,就应该使用DI,因为它是实现对象及其协作者或依赖项之间的松散耦合的一种技术。有关更多信息,以下问题可能很有趣:我应该使用依赖注入还是静态工厂?
因此,只需将ILogger<CustomClass>添加到其构造函数中(实际上与控制器的方式相同),因为.NET Core默认只支持构造函数注入:
public class CustomClass
{
private readonly ILogger _logger;
public CustomClass(ILogger<CustomClass> logger)
{
_logger = logger;
}
}ASP.NET核心的内置依赖注入容器将自动解决瞬态依赖关系。因此,如果控制器将类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
}
}请注意,还需要使用Startup方法在IServiceCollection.Add…中注册依赖项:
public void ConfigureServices(IServiceCollection services)
{
// ...
services.AddTransient<ClassB>();
services.AddTransient<ClassA>();
}内置日志支持意味着.NET Core知道并正在使用内置抽象进行日志记录。这主要是由ILoggerFactory和ILoggerProvider接口完成的。
/// <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实例。
https://stackoverflow.com/questions/53879275
复制相似问题