При использовании Serilog с ASP.NET Core 3.0 как создать регистратор на лету с отдельной конфигурацией, отличной от корневого регистратора? - PullRequest
0 голосов
/ 28 октября 2019

У меня есть служба Windows, которую я пишу с использованием .Net Core 3.0. Моя служба должна иметь ведение журнала как для службы, так и для заданий, которые обрабатываются в этой службе. Я хотел бы, чтобы служба входила в консоль (когда применимо) и файл журнала. Это достаточно просто:

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;
    }
}
...