【问题标题】:Net Core 2 Serilog inject from Console App to WebhostNet Core 2 Serilog 从控制台应用程序注入到 Webhost
【发布时间】:2018-12-09 10:22:24
【问题描述】:

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

场景:

我从控制台应用程序中获得了一个 Main 类,我在其中配置了一个记录器 (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 配置为 net core 2 中的典型 webhost 应用程序。Launch Method 做了类似的事情。命名空间2

      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;

然后我的问题是如何在这种情况下在 Startup used 类中使用我的 Logger。我的意图是以最好和更简单的方式使记录器全球化。您打算采用什么解决方案?

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

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

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

【问题讨论】:

  • 在我看来,在您的场景中,完全建议使用静态 Serilog.Log.Logger 属性。我看不出在 Program 类中使用作用域实例有任何优势。
  • @FedericoDipuma 这是真的。我已经更改了代码。但是我怎么能从启动类中传递(和日志)?
  • 现在你有了静态实例,你可以在你的启动类中使用Log.Info()(和其他方法)
  • 重点是我在做 Log.Information("Startup: Configure services");来自 ConfigureServices 方法,它没有在控制台或文件中写入任何内容,我不知道我缺少什么。
  • 在您的帖子中,您没有添加查找问题所需的所有信息,但从您之前发布的 github 存储库中明确您正在执行 Log.CloseAndFlush(); 正确在创建 WebHostBuilder 之后(当然,它会立即关闭当前的记录器)。这就是您之后看不到任何日志的原因。请将完整代码添加到您的问题中。

标签: c# startup serilog .net-core-2.0


【解决方案1】:

您可以在ConfigureServices 方法中注册您的记录器:

var builder = new WebHostBuilder()
            .UseKestrel()

            ...

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-08
    • 2018-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多