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() { }
}
Hangfire documentation is licensed under the CC BY 4.0.