现在我正在创建一个 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));
}
}
但是在项目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);
}
}
基本控制器类如下所示:
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));
}
}
如果我使用NLog.Logger log = NLog.LogManager.GetCurrentClassLogger(); 在API项目上它可以工作,但是我想将它注入到构造函数中,我该怎么做呢?
我尝试将包 NLog 添加到我想使用记录器的所有项目中,就像这个问题的解决方案一样,但仍然没有用。
编辑:我如何注册 NLog:
public static void Main(string[] args)
{
var logger = NLogBuilder.ConfigureNLog("NLog.config").GetCurrentClassLogger();
try
{
logger.Debug("init main");
CreateHostBuilder(args).Build().Run();
}
catch (Exception exception)
{
//NLog: catch setup errors
logger.Error(exception, "Stopped program because of exception");
throw;
}
finally
{
NLog.LogManager.Shutdown();
}
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureLogging(logging =>
{
logging.ClearProviders();
logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
})
.UseNLog();
}
Api模块注册:
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);
}
}
}