Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在net core 3.1的多个项目中注入NLog作为ILogger_C#_Asp.net Core_Dependency Injection_Nlog_Ilogger - Fatal编程技术网

C# 如何在net core 3.1的多个项目中注入NLog作为ILogger

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

现在我正在创建一个web服务,并开始使用NLog记录器。我对它进行了配置,在web服务项目中使用它时,它可以工作,如下所示:

   [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"
    }
  }