将Serilog与ASP.NET Core 3.0结合使用时,如何动态创建一个与根记录器不同的记录器?

时间:2019-10-28 18:06:56

标签: asp.net-core serilog

我有一个使用.Net Core 3.0编写的Windows服务。我的服务需要同时记录服务和在该服务中处理的作业。我希望该服务登录到控制台(如果适用)和一个日志文件。这很容易:

var loggerConfiguration = new LoggerConfiguration()
                .ReadFrom.Configuration(this.ConfigurationRoot, "Logging")
                .MinimumLevel.Verbose()
                .Enrich.FromLogContext()
                .WriteTo.Console(outputTemplate: LogMessageFormat, theme: AnsiConsoleTheme.Literate);


if (this.AppConfiguration.Value.CreateLogFile)
{
     var filePath = Path.Combine(this.AppConfiguration.Value.LogFilePath, "service.log");
      loggerConfiguration.WriteTo.File(filePath, restrictedToMinimumLevel: LogEventLevel.Verbose, outputTemplate: LogMessageFormat);
}

// Now every ILogger or ILogger<T> that I resolve uses the above configuration
Log.Logger = loggerConfiguration.CreateLogger();

但是,此服务从队列中处理作业,每个作业都需要将其处理记录到仅包含处理日志的文件中。作业所做的任何日志记录都必须显示在单独的日志文件中,并且在完成作业处理后,该文件将不再被修改。

例如,假设该服务正在运行,然后有一个作业进入。我想获得该服务的日志输出:

service.log
Service is waiting...
Service is waiting...
Service is waiting...
Service is waiting...
Starting job 1234
Completed job 1234
Service is waiting...
Service is waiting...
Starting job 5678
Completed job 5678
Service is waiting...
...

然后是特定于流程的日志

service.process1234.log
This log message is logged by the handler for process 1234
service.process5678.log
This log message is logged by the handler for process 5678

如果我能以某种方式使用ILoggerFactory来创建配置为 与根记录器分开的记录器 ,这将非常方便。进行处理的类。例如:

public class ProcessorFactory
{
    private readonly ILoggerFactory loggerFactory;

    public ProcessorFactory(ILoggerFactory loggerFactory)
    {
        this.loggerFactory = loggerFactory;
    }

    public IProcessor CreateProcessor(JobRequest request)
    {
        // Something like this is what I'm hoping to be able to do
        var loggingConfig = new LoggingConfig { File = $"service.process{request.Id}" };
        var processLogger = this.loggerFactory.CreateLogger(...);
        var processor = new Processor(processLogger, request);
        return processor;
    }
}

0 个答案:

没有答案
相关问题