Некоторое время я успешно использовал NLog с .NET Core 2.0 и настраиваемую цель для записи в хранилище BLOB-объектов Azure.
Теперь я обновился до .NET Core 2.1, и развернутое решение для веб-приложения Azure не удается, потому что, согласно журналу событий Kudu, NLog не может найти настраиваемую цель, определенную в файле конфигурации NLog, хотя, похоже, это работает просто отлично на местном уровне.
Мой конструктор хоста выглядит следующим образом:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseUnityServiceProvider()
.UseNLog()
.UseStartup<Startup>();
и моя цель NLog определена в классе запуска:
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 - это просто оболочка для решения, основанного на Настраиваемая цель с внедренными службами для NLog с ядром .NET
i.e.
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 Core, так что NLog вызывается перед методом Startup. Поскольку NLog настроен на «автоматическое обнаружение» nlog.config, он пытается настроить его до того, как я смогу правильно настроить цель.
Если я переименую файл nlog.config, автообнаружение не произойдет, и NLog придется ждать, пока я не запустил метод ConfigureNLog в моем классе регистров. Тогда все работает нормально.
Кто-нибудь знает, какое правильное место в конвейере ASP.NET Core 2.1, вызываемом Azure, - это убедиться, что я могу правильно настроить цель NLog, прежде чем NLog попытается выполнить автонастройку?