首页 文章

Net Core 2 Serilog从Console App注入Webhost

提问于
浏览
1

我想知道如何管理和最佳方式将Serilog实例从控制台应用程序带到配置webhost的StartUp类 .

场景:

我从一个控制台应用程序中获得了一个Main类,我在其中配置了一个logger(serilog) . 命名空间1

static void Main(string[] args)
    {
        DateTime Date = new DateTime.Now;
           Log.Logger = = new LoggerConfiguration()
         .MinimumLevel.Debug()
         .MinimumLevel.Override("Microsoft", LogEventLevel.Information)
         .Enrich.FromLogContext()
         .WriteTo.Console()
         .WriteTo.File($"Log-Startup-{Date}.txt", rollingInterval: 
RollingInterval.Day, outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff 
zzz}")
         .CreateLogger();

[...]

`StaticLauncherClass.Launch(args, config, Log.Logger)`;

在此之后请注意,我只是调用静态类方法,然后传递Logger .

静态类应该将Webhost配置为网络核心2中的典型webhost应用程序 . 启动方法执行类似的操作 . Namespace2

public static IConfiguration Config { get; private set; }


public static void Launch(string[] args, IConfigurationSection config, 
ILogger logger)
        {
            Log.Logger = logger;
            Config = config;
            CreateWebHostBuilder(args).Build().Run();
        }


      public static IWebHostBuilder CreateWebHostBuilder(string[] args)
        {
            Log.Information("Starting web host");
  Serilog.ILogger _logger = Log.Logger;
            try
            {
                return CreateWebhostBuilder(args)
                        // Use Serilog
                        // Evitar inicio de hospedaje
                        .UseSerilog()
                        .UseSetting(WebHostDefaults.PreventHostingStartupKey, 
"true")
                    .ConfigureServices(svc =>
{
    svc.AddSingleton(_logger);
})
                        .UseStartup<Startup>();
            }
[...]
}

在同一个类中,最后CreateWebhostBuilder(args)配置webhost

var builder = new WebHostBuilder()
           .UseKestrel()
            .UseContentRoot(Directory.GetCurrentDirectory())
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
                var env = hostingContext.HostingEnvironment;

                if (env.IsDevelopment())
                {
                    var appAssembly = Assembly.Load(new 
AssemblyName(env.ApplicationName));
                    if (appAssembly != null)
                    {
                        config.AddUserSecrets(appAssembly, optional: true);
                    }
                }

                if (args != null)
                {
                    config.AddCommandLine(args);
                }
                config.SetBasePath(Directory.GetCurrentDirectory());
                // Add settings to bootstrap EF config.
            })

            .UseIISIntegration()
            .UseDefaultServiceProvider((context, options) =>
            {
                options.ValidateScopes = 
context.HostingEnvironment.IsDevelopment();
            });


    return builder;

然后我的问题是如何在这种情况下我可以 use my Logger in Startup used class. My intention is to globalize logger the best and easier way posible. What solutions you purpose?

internal class Startup {
???
???
 public Startup(IConfiguration config, IHostingEnvironment environment)
    {       
        ???
    }

   public void ConfigureServices(IServiceCollection services)
    {
        Console.WriteLine("Startup");
        Log.Information("Startup: Configure services");
    }
}

Startup类正在编写Console.WriteLine内容,但不会写入Log.Information内容 . 编辑:实际状态,将服务带到启动但不应用为登录文件提供的配置 . 我认为它只是默认行为 .

1 回答

  • 2

    您可以使用 ConfigureServices 方法注册 Logger :

    var builder = new WebHostBuilder()
                .UseKestrel()
    
                ...
    
                .UseIISIntegration()
                .ConfigureServices(servicesCollection =>
                {
                    servicesCollection.AddSingleton<Serilog.ILogger>(logger);              
                })
                .UseDefaultServiceProvider((context, options) =>
                {
                    options.ValidateScopes = 
    context.HostingEnvironment.IsDevelopment();
                });
    

相关问题