在相同 class + 依赖注入中针对不同目的使用不同的 Serilog Sinks
Use Different Serilog Sinks for different purposes in the same class + dependency injection
我需要使用 Serilog 将一些数据写入 elasticsearch,但我想将所有其他日志写入不同的接收器,例如控制台。这可能吗?我应该如何修改 main 和 CreateHostBuilder 方法来实现?
我想要的是这样的:
public class Processor
{
private readonly ILogger<Processor> _logger;
public Processor(ILogger<Processor> logger)
{
_logger = logger;
}
public void Process(object message1, string message2, string message 3)
{
_logger.LogInformation("processor started);
_logger.LogInfomration("{@message1}", message1);//want this use a console sink
_logger.LogInfomration("{@message2}", message2);//want this use a eleasticsearch sink
_logger.LogInfomration("{@message3}", message3);//want this use a console sink
}
我当前的主要方法和 CreateHostBuilder 方法是:
public static async Task Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.WriteTo.Elasticsearch(
options: new ElasticsearchSinkOptions(new
Uri("http://localhost:9200"))
{
AutoRegisterTemplate = true,
IndexFormat = $"
{Assembly.GetExecutingAssembly().GetName().Name.ToLower().Replace(".",
"-")}-" + $"{DateTime.UtcNow:MM-dd-yyyy}",
})
.CreateLogger();
await CreateHostBuilder(args)
.Build()
.RunAsync()
.ConfigureAwait(false);
Log.CloseAndFlush();
}
public static IHostBuilder CreateHostBuilder(string[] args, StringBuilder configLog) =>
CreateDefaultBuilder(args)
.UseSerilog();
您可以使用.WriteTo.Conditional
,例如根据模板文本进行区分:
logOpts.WriteTo.Conditional(le => le.MessageTemplate.Text.Contains("message2"),
cfg => cfg.Elasticsearch(....));
或考虑使用 Serilog.Filters.Expressions
with sub-loggers。
我需要使用 Serilog 将一些数据写入 elasticsearch,但我想将所有其他日志写入不同的接收器,例如控制台。这可能吗?我应该如何修改 main 和 CreateHostBuilder 方法来实现?
我想要的是这样的:
public class Processor
{
private readonly ILogger<Processor> _logger;
public Processor(ILogger<Processor> logger)
{
_logger = logger;
}
public void Process(object message1, string message2, string message 3)
{
_logger.LogInformation("processor started);
_logger.LogInfomration("{@message1}", message1);//want this use a console sink
_logger.LogInfomration("{@message2}", message2);//want this use a eleasticsearch sink
_logger.LogInfomration("{@message3}", message3);//want this use a console sink
}
我当前的主要方法和 CreateHostBuilder 方法是:
public static async Task Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.WriteTo.Elasticsearch(
options: new ElasticsearchSinkOptions(new
Uri("http://localhost:9200"))
{
AutoRegisterTemplate = true,
IndexFormat = $"
{Assembly.GetExecutingAssembly().GetName().Name.ToLower().Replace(".",
"-")}-" + $"{DateTime.UtcNow:MM-dd-yyyy}",
})
.CreateLogger();
await CreateHostBuilder(args)
.Build()
.RunAsync()
.ConfigureAwait(false);
Log.CloseAndFlush();
}
public static IHostBuilder CreateHostBuilder(string[] args, StringBuilder configLog) =>
CreateDefaultBuilder(args)
.UseSerilog();
您可以使用.WriteTo.Conditional
,例如根据模板文本进行区分:
logOpts.WriteTo.Conditional(le => le.MessageTemplate.Text.Contains("message2"),
cfg => cfg.Elasticsearch(....));
或考虑使用 Serilog.Filters.Expressions
with sub-loggers。