我有一个 Quartz.NET 作业的作业定义:
public class ProcessMessageJob : IJob
{
private readonly ILogger<ProcessMessageJob> _logger;
private readonly TransferMessageService _transferMessageService;
public ProcessMessageJob(ILogger<ProcessMessageJob> logger, TransferMessageService transferMessageService)
{
_logger = logger;
_transferMessageService = transferMessageService;
}
public async Task Execute(IJobExecutionContext context)
{
await _transferMessageService.ProcessTransferMessages();
}
}
我希望在我的服务中使用 Quartz.NET 作业中的
context.FireInstanceId
来添加日志记录(无需将 fireinstanceId 添加为每个方法调用的参数):
public async Task ProcessTransferMessages()
{
var fireInstanceId = magicSpell.getCurrentQuartzFireInstanceId();
_logger.LogInformation("FireinstanceId: {fireInstanceId}", fireInstanceId);
}
有什么东西可以直接从 Quartz.NET 获得吗?或者我可以使用依赖注入来解决这个问题吗?在我的工作中创建新范围时?
public async Task Execute(IJobExecutionContext context)
{
var scope = _services.CreateScope();
var tms = scope.ServiceProvider.GetRequiredService<TransferMessageService>(); //add FireInstanceId here somehow??
await tms.ProcessTransferMessages();
}
LogContext.PushProperty
在作业开始时使用 FireInstanceId
设置 Serilog 属性 Execute(IJobExecutionContext)
outputTemplate
就是这样。现在,甚至会从您的作业依赖项中记录
FireInstanceId
。
using Serilog.Context;
class MyJob : IJob
{
public async Task Execute(IJobExecutionContext jobContext)
{
using var _ = LogContext.PushProperty("JobFireInstanceId", jobContext.FireInstanceId);
// Job logic...
}
}
outputTemplate: "[{Timestamp:yyyy-MM-dd HH:mm:ss} {Level} {JobFireInstanceId}] {Message}{NewLine}"
[2023-11-13 17:02:05 Debug 638354729585261760] My log message
QuartzSerilogPlayground
。
现在,当您开始工作时,您可能需要考虑一些改进。也许您不想将这样的说明复制并粘贴到您的每一项工作中。也许您不想在所有作业中重复属性名称。也许您想在全局范围内配置一次行为,并且根本不更改作业。
我考虑了具有行为的基本工作类别,但最终我在
IJobExecutionContext
上保留了简单的扩展方法,所以我的工作从:开始
public async Task Execute(IJobExecutionContext jobContext)
{
using var _ = jobContext.PushSerilogPropertyJobFireInstanceId();