我正在开发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来实现它,但是它不起作用。