使用扩展方法通过Serilog配置写日志

时间:2019-01-17 09:38:09

标签: c# logging asp.net-core-webapi serilog

我正在开发asp.net core web api服务。我需要将日志写入控制台和Logstash。我是通过以下代码实现的:

public class Program
{
    private static IConfiguration Configuration { get; } = new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())                              
        .AddJsonFile("appsettings.json")
        .AddEnvironmentVariables()
        .Build();

    public static void Main(string[] args)
    {
        var uri = Configuration.GetSection("Serilog").GetSection("uri").Value;

        Log.Logger = new LoggerConfiguration()
            .MinimumLevel.Override("Microsoft", LogEventLevel.Error)
            .ReadFrom.Configuration(Configuration)
            .WriteTo.Console()
            .WriteTo.TCPSink(uri)
            .CreateLogger();

        try
        {
            Log.Information("Starting web host");
            CreateWebHostBuilder(args).Build().Run();
        }
        catch (Exception ex)
        {
            Log.Fatal(ex, "Host terminated unexpectedly");
        }
        finally
        {
            Log.CloseAndFlush();
        }
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args)
    {   
        return WebHost
            .CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .UseSerilog();  
    }
}

问题是我需要使用公司的dll,其中有两种扩展方法-一种用于登录控制台,另一种-用于通过tcp登录。

以下是这些方法的示例:

    public static IWebHostBuilder UseTCPLogging(
        this IWebHostBuilder builder,
        IConfiguration configuration, string uri)
    {
        return builder
            .UseSerilog((hostingContext, loggerConfiguration) => loggerConfiguration
                .MinimumLevel.Override("Microsoft", LogEventLevel.Error)
                .ReadFrom.Configuration(configuration)
                .WriteTo.TCPSink(uri));
    }

    public static IWebHostBuilder UseConsoleLogging(
        this IWebHostBuilder builder)
    {
        return builder
            .UseSerilog((hostingContext, loggerConfiguration) => loggerConfiguration
                .MinimumLevel.Override("Microsoft", LogEventLevel.Error)
                .ReadFrom.Configuration(configuration)
                .WriteTo.Console());
    }

然后,我们可以通过以下方式使用它们:

public class Program
{
    private static IConfiguration Configuration { get; } = new ConfigurationBuilder()
        // . . . the same as above

    public static void Main(string[] args)
    {
        try
        {
            CreateWebHostBuilder(args).Build().Run();
        }
        catch (Exception ex)
        {
            Log.Fatal(ex, "Host terminated unexpectedly");
        }
        finally
        {
            Log.CloseAndFlush();
        }
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args)
    {
        var uri = Configuration.GetSection("Serilog").GetSection("uri").Value;

        return WebHost
            .CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .UseConsoleLogging()
            .UseTCPLogging(Configuration, uri);  
    }
}

但是问题在于,使用此代码日志只能由tcp写入,而不能在控制台中写入。看起来UseTCPLogging()覆盖LoggerConfiguration

我想知道这两种扩展方法有什么方法可以满足我的需要。仅创建一种可以通过tcp写入控制台的方法似乎不是一个好的解决方法。

更新25-01-19:

我试图使用 Decorator设计模式 like this来实现它,但是它不起作用。

0 个答案:

没有答案