簡體   English   中英

向ASP.NET Core的DI注冊NLog目標(具有依賴項)

[英]Register NLog target (with dependencies) with ASP.NET Core's DI

我正在使用最新的NLog,ASP.NET Core,EF Core。

我編寫了一個自定義日志目標,該目標通過EF保存:

public  class MyEFTarget : TargetWithLayout
{
    private readonly IMyContext _context;

    public MyEFTarget(IMyContext context) : base()
    {
        _context = context;
    }

    protected override void Write(LogEventInfo logEvent)
    {
        // and so on...
    }

}

我的Startup

public void ConfigureServices(IServiceCollection services)
{
  // register context with DI (as scoped)
  services.AddDbContext<MyContext>(o => o.UseSqlite(config.GetConnectionString("Default")));
  services.AddScoped<IMyContext, MyContext>();      

  // target depends on context, so must also be registered with DI
  // I chose scoped so it's the same as the context
  services.AddScoped<MyEFTarget>();

  // ...and so on
}


public void Configure(IApplicationBuilder app, IHostingEnvironment env,
    ILoggerFactory loggerFactory, IServiceProvider serviceProvider)
{
  // normal NLog config 
  env.ConfigureNLog("NLog.config");
  loggerFactory.AddNLog();
  app.AddNLogWeb();

  // register target
  Target.Register<MyEFTarget>("MyEFTarget");

  // add target + rule programmatically
  var target = serviceProvider.GetService<MyEFTarget>();
  var rule = new LoggingRule("*", LogLevel.Info, target);
  LogManager.Configuration.AddTarget("MyEFTarget", target);    // problem is here ********
  LogManager.Configuration.LoggingRules.Add(rule);
  LogManager.ReconfigExistingLoggers();

  // ...and so on
}

問題是NLog在應用程序的持續時間內緩存了target實例...我認為是嗎? 所以基本上是單身。 並且它一直在引用我的EF上下文,這可能會被丟棄。

有沒有更好的辦法?

要籠統地重述該問題(因為這不是EF問題),“如何注冊/添加具有短暫依賴關系的自定義目標”?

加載NLog配置時,NLog將使用ConfigurationItemFactory.Default.CreateInstance創建目標的實例,並且僅在重新加載配置時才會重新創建目標。

如果每次都需要一個新的EF上下文,我建議將EF上下文加載到protected override void Write(LogEventInfo logEvent)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM