在同一个类+依赖项注入中,将不同的序列号接收器用于不同的目的



我需要使用Serilog将一些数据写入弹性搜索,但我想将所有其他日志写入不同的接收器,如Console。这可能吗?我应该如何修改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与子记录器一起使用。

最新更新