C# 如何在net core 3.1的多个项目中注入NLog作为ILogger
现在我正在创建一个web服务,并开始使用NLog记录器。我对它进行了配置,在web服务项目中使用它时,它可以工作,如下所示:C# 如何在net core 3.1的多个项目中注入NLog作为ILogger,c#,asp.net-core,dependency-injection,nlog,ilogger,C#,Asp.net Core,Dependency Injection,Nlog,Ilogger,现在我正在创建一个web服务,并开始使用NLog记录器。我对它进行了配置,在web服务项目中使用它时,它可以工作,如下所示: [ApiController] public class SimpleController : BaseController<SimpleApi> { private readonly ILogger<SimpleController > _logger; public MarcatgeC
[ApiController]
public class SimpleController : BaseController<SimpleApi>
{
private readonly ILogger<SimpleController > _logger;
public MarcatgeController(ILogger<SimpleController > logger, IServiceProvider provider) : base(provider)
{
_logger = logger ?? throw new NullReferenceException(nameof(logger));
}
[HttpPost]
public async Task<IActionResult> SimpleMethod([FromBody]Request request)
{
_logger.LogInformation("SimpleMethod");
return ParseResponse(await CurrentApi.SimpleMethod(request));
}
}
public class BaseController<T> : Controller where T : BaseApi
{
protected T CurrentApi { get; private set; }
public BaseController(IServiceProvider provider)
{
CurrentApi = (T)ActivatorUtilities.CreateInstance(provider, typeof(T));
}
}
[ApiController]
公共类SimpleController:BaseController
{
专用只读ILogger\u记录器;
公共MarcatgeController(ILogger记录器、IServiceProvider提供程序):基本(提供程序)
{
_logger=logger??抛出新的NullReferenceException(nameof(logger));
}
[HttpPost]
公共异步任务SimpleMethod([FromBody]请求)
{
_logger.LogInformation(“SimpleMethod”);
返回ParseResponse(等待CurrentApi.SimpleMethod(请求));
}
}
但是在项目API上使用它时(当它调用CurrentApi时),不会记录任何内容:
public class SimpleApi: BaseApi
{
private readonly ILogger<SimpleApi> _logger;
public MarcatgeApi(ILogger<SimpleApi> logger)
{
_logger = logger ?? throw new NullReferenceException(nameof(logger));
}
public Task<Response<ResponseSimple> SimpleMethod(Request request)
{
_logger.LogDebug($"SimpleApi -> SimpleMethod()");
return GetResponseSuccess<ResponseSimple>(resp);
}
}
公共类SimpleApi:BaseApi
{
专用只读ILogger\u记录器;
公共MarcatgeApi(ILogger记录器)
{
_logger=logger??抛出新的NullReferenceException(nameof(logger));
}
公共任务最后,我得到了@RolfKristensen的答案
我将我的appsettings.json和appsettings.Development.json的日志部分更新为以下内容:
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Trace",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
}
您只需在DI框架中注册Nlog。这似乎是一个很好的指南:。第4部分似乎是您缺少的部分。很抱歉,我忘了说明如何注册Nlog,但它与链接完全一样,仍然无法工作。您似乎使用Activator.CreateInstance
手动创建这些api。这不使用DI或任何东西。为什么不使用CurrentApi=provider.GetRequiredService();
?(但要记住注册api!)通常您也希望避免注入IServiceProvider
,只要让构造函数请求所需的内容即可。请尝试从LogDebug
更改为LogWarning
。另请参阅
public class ApiModule
: Autofac.Module
{
public ApiModule()
{
}
protected override void Load(ContainerBuilder builder)
{
try
{
builder.RegisterType<BaseApi>();
builder.RegisterType<BaseAuthApi>();
builder.RegisterType<MarcatgeApi>();
var mapper = MappingProfile.InitializeAutoMapper().CreateMapper();
// Registrem mapper
builder.RegisterInstance<IMapper>(mapper);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Trace",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
}