Using Job Filters¶
All processes are implemented with Chain-of-responsibility pattern and can be intercepted like with ASP.NET MVC Action Filters.
Define the filter
public class LogEverythingAttribute : JobFilterAttribute,
IClientFilter, IServerFilter, IElectStateFilter, IApplyStateFilter
{
private static readonly ILog Logger = LogProvider.GetCurrentClassLogger();
public void OnCreating(CreatingContext context)
{
Logger.InfoFormat("Creating a job based on method `{0}`...", context.Job.Method.Name);
}
public void OnCreated(CreatedContext context)
{
Logger.InfoFormat(
"Job that is based on method `{0}` has been created with id `{1}`",
context.Job.Method.Name,
context.BackgroundJob?.Id);
}
public void OnPerforming(PerformingContext context)
{
Logger.InfoFormat("Starting to perform job `{0}`", context.BackgroundJob.Id);
}
public void OnPerformed(PerformedContext context)
{
Logger.InfoFormat("Job `{0}` has been performed", context.BackgroundJob.Id);
}
public void OnStateElection(ElectStateContext context)
{
var failedState = context.CandidateState as FailedState;
if (failedState != null)
{
Logger.WarnFormat(
"Job `{0}` has been failed due to an exception `{1}`",
context.BackgroundJob.Id,
failedState.Exception);
}
}
public void OnStateApplied(ApplyStateContext context, IWriteOnlyTransaction transaction)
{
Logger.InfoFormat(
"Job `{0}` state was changed from `{1}` to `{2}`",
context.BackgroundJob.Id,
context.OldStateName,
context.NewState.Name);
}
public void OnStateUnapplied(ApplyStateContext context, IWriteOnlyTransaction transaction)
{
Logger.InfoFormat(
"Job `{0}` state `{1}` was unapplied.",
context.BackgroundJob.Id,
context.OldStateName);
}
}
Apply it
Like ASP.NET filters, you can apply filters on method, class and globally:
[LogEverything]
public class EmailService
{
[LogEverything]
public static void Send() { }
}
GlobalJobFilters.Filters.Add(new LogEverythingAttribute());
If your service is resolved via interface, then the filter should be applied to your interface instead of class:
[LogEverything]
public interface IEmailService
{
[LogEverything]
void Send() { }
}
Please use Hangfire Forum for long questions or questions with source code.
Hangfire documentation is licensed under the CC BY 4.0.
Created using Sphinx 1.8.6, proudly hosted by Read the Docs.