我使用NLog和.NET Core 2.0以及自定义目标成功写入Azure Blob存储已有一段时间了。
尽管它在当地似乎很管用
.
我的主机生成器如下:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseUnityServiceProvider()
.UseNLog()
.UseStartup<Startup>();
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", false, true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", true)
.AddJsonFile("appsettings.local.json", true)
.AddEnvironmentVariables();
Configuration = builder.Build();
HostingEnvironment = env;
NLogRegistry.Register(env, new ConfigurationAdapter(Configuration));
}
NLog注册表只是基于
Custom target with injected services for NLog with .net core
即
public class NLogRegistry
{
public static void Register(IHostingEnvironment env, IConfigurationAdapter configuration)
{
//Setup custom NLog Azure Blob logger with injected configuration
Target.Register<AzureBlobStorageTarget>("AzureBlobStorage");
var nlog = ConfigurationItemFactory.Default.CreateInstance;
ConfigurationItemFactory.Default.CreateInstance = type =>
{
try
{
return nlog(type);
}
catch (Exception)
{
}
return new AzureBlobStorageTarget(configuration);
};
env.ConfigureNLog("nlog.config");
}
}
我认为正在发生的是.NET核心管道的行为发生了一些变化,因此NLog在启动方法之前被调用。由于NLog被配置为“auto discovery”NLog.config,所以在我有机会正确配置目标之前,它会尝试设置。
是否有人知道Azure调用的ASP.NET Core 2.1管道中的正确位置,以确保在NLog尝试自动配置自身之前,我可以正确配置NLog目标?