我希望能够通过Hangfires上下文控制台使用我的日志来发出事件,以便我不需要使用context.writeline将日志事件输出到我的hangfire仪表板。
我已经尝试实现一个特定的Serilog sink以达到此目的。但是,由于我需要来自hangfire的PerformContext(在运行时注入到任务方法中),因此我无法在应用程序启动时配置日志池。我尝试在任务方法内创建一个新的记录器,只是为了看看是否可以工作,但它并没有起作用 - 有人能够看到为什么它不起作用,或者可能建议另一种方法吗?
下面是该汇流处:
任务方法:
我已经尝试实现一个特定的Serilog sink以达到此目的。但是,由于我需要来自hangfire的PerformContext(在运行时注入到任务方法中),因此我无法在应用程序启动时配置日志池。我尝试在任务方法内创建一个新的记录器,只是为了看看是否可以工作,但它并没有起作用 - 有人能够看到为什么它不起作用,或者可能建议另一种方法吗?
下面是该汇流处:
class HangfireContextSink : ILogEventSink {
private readonly IFormatProvider formatProvider;
private readonly PerformContext context;
public HangfireContextSink(IFormatProvider formatProvider, PerformContext context) {
this.formatProvider = formatProvider;
this.context = context;
}
public void Emit(LogEvent logEvent) {
var message = logEvent.RenderMessage(formatProvider);
context.WriteLine(ConsoleTextColor.Blue, DateTimeOffset.Now.ToString() + " " + message);
}
水槽配置:
public static class SinkExtensions {
public static LoggerConfiguration HangfireContextSink(this LoggerSinkConfiguration loggerSinkConfiguration, PerformContext context, IFormatProvider formatProvider = null) {
return loggerSinkConfiguration.Sink(new HangfireContextSink(formatProvider, context));
}
}
任务方法:
public static bool TestJob(PerformContext context) {
using (LogContext.PushProperty("Hangfirejob", "TestJob")) {
try {
using (var hangfireLog = new LoggerConfiguration().WriteTo.HangfireContextSink(context).CreateLogger()) {
var progress = context.WriteProgressBar("Progress");
for (int i = 0; i < 10; i++) {
context.WriteLine("Working with {0}", i);
progress.SetValue((i + 1) * 10);
Log.Debug("Test serilog");
hangfireLog.Debug("Test from hangfirelog");
Thread.Sleep(5000);
}
}
Log.Debug("Done testjob");
return true;
} catch (Exception ex) {
Log.Error(ex, "Error!");
return false;
}
}
}
PerformContextProperty
类的Render()
方法中删除NotImplementedException
的抛出来解决此问题。我已经在我的回答中进行了编辑 - 只需将此方法保留为空即可。这样做是可以的,因为PerformContextProperty.Render()
仅用于PerformContext
属性,并且不会带来任何有用的有效负载。但是,这种方法将在结果JSON中输出一个值为空字符串的PerformContext
属性。我希望这对您来说不是问题,因为没有简单的方法可以抑制从输出中添加的属性。 - CodeFuller