我需要使用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
与子记录器一起使用。