我正在开发一个程序,该程序创建一个或多个独立但同时工作的工人阶级。我希望改进日志记录,但为了便于阅读,希望每个工作对象都写入单独的日志文件。
我最初的计划是使用 Microsoft.Extensions.Logging.ILogger 通过 DI 使用 Serilog,但目前尚不清楚如何正确配置 Serilog,假设它是可能的。WriteTo.Map
似乎很接近,但似乎无法获得我可能正在处理的对象的动态数量,并且需要一个在注入的 ILogger 对象中不可用的 propertyName 字符串。
在下面我一直在测试的模型中,我希望为每个 Worker 对象生成一个单独的日志文件,例如 worker0.log、worker1.log 等。
核选项似乎是在每个 Worker 对象中配置一个单独的 LoggerFactory 但我认为这太过分了。有没有一种简单的方法可以使用一个 LoggerFactory 来实现这一点?
主班
public class MainClass
{
ILoggerFactory _factory = null;
ILogger _logger = null;
Worker[] workers = { };
public MainClass(ILoggerFactory factory)
{
var serilog = new LoggerConfiguration().MinimumLevel.Verbose()
.WriteTo.???
.CreateLogger();
_factory = new LoggerFactory().AddSerilog(serilog);
_logger = _factory.CreateLogger("Main");
_logger.LogInformation("Main created.");
workers = Enumerable.Range(0, 3).Select(r => new Worker(factory.CreateLogger($"worker{r}"))).ToArray();
}
public void Execute()
{
_logger.LogInformation("doing work");
foreach (var s in workers) s.DoWork();
}
}
工人阶级
public class Worker
{
ILogger _logger = null;
public Worker(ILogger logger)
{
_logger = logger;
_logger.LogInformation("Worker instantiated.");
}
public void DoWork()
{
// work stuff
_logger.LogInformation("working");
}
}