[英]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.