代码之家  ›  专栏  ›  技术社区  ›  GrahamB

NLog自定义目标在Azure.NET Core 2.1中失败

  •  1
  • GrahamB  · 技术社区  · 7 年前

    我使用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目标?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Rolf Kristensen Raúl Diego    6 年前

    而不是注射 IConfiguration 在AzureBlobStorageTarget的构造函数中,现在可以只对AzureBlobStorageTarget属性使用NLog布局类型。

    然后使用配置布局 ${configsetting}

    https://github.com/NLog/NLog/wiki/ConfigSetting-Layout-Renderer

    也可以考虑改成这个非直瞄目标:

    https://github.com/JDetmar/NLog.Extensions.AzureStorage#blob-configuration

    但如果坚持使用依赖于构造函数参数的依赖注入的自定义目标:

    https://github.com/NLog/NLog/wiki/Dependency-injection-with-NLog

    推荐文章