
Laravelで、Job&Queueを扱う際に、Queueに投入されたJobの実行履歴をログに出力したい場面があったので、今回はその方法について書いています
Job&Queueを扱う際に、Laravel では、jobsテーブルとfailed_jobsテーブルを用意するかと思います。
Jobの実行に失敗した際には、failed_jobsテーブルにデータが投入されますが、Jobの実行に成功した場合には、jobsテーブルからデータが消えてしまいます。
この場合、後から実行履歴を確認したい場合にデータを確認することができないので、Queueファサードを使って、Jobの実行履歴をログに出力していきます!
LaravelのQueueファサードを使って、ジョブの実行履歴をログに出力する方法
LaravelのQueueファサードを使って、ジョブの実行履歴にログを出力していきます。具体的には、下記のタイミングでログを出力することができます。
- キューに投入したジョブを実行する前(Queue::before)
- キューに投入したジョブを実行した後(Queue::after)
- キューに投入したジョブが失敗した時(Queue::failing)
キューに投入したジョブを実行する前に実行するコールバックを指定することができます。
基本的には、サービスプロバイダのbootメソッドから呼び出す必要があり、今回はLaravel側で用意しているAppServiceProvider.php内のbootメソッドから呼び出します。
のちほど紹介する「Queue::after」および「Queue::failing」も同様です。
namespace App\Providers;
use Illuminate\Queue\Events\JobFailed;
use Illuminate\Queue\Events\JobProcessed;
use Illuminate\Queue\Events\JobProcessing;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Queue;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
(省略)
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
// ジョブが処理される前に実行される
Queue::before(function (JobProcessing $event) {
// $event->connectionName
// $event->job
});
// ジョブが処理された後に実行される
Queue::after(function (JobProcessed $event) {
// $event->connectionName
// $event->job
});
// ジョブが失敗した時に実行される
Queue::failing(function (JobFailed $event) {
// $event->connectionName
// $event->job
// $event->exception
});
}
}
Queue::before
// ジョブが処理される前に実行される
Queue::before(function (JobProcessing $event) {
// $event->connectionName
// $event->job
});

Queueファサードのbeforeメソッドを使って、キューに投入されたジョブが処理される前に実行するコールバックを指定することができます
引数には、JobProcessingを指定。connectionNameやjobインスタンスを取得することができます。詳細は、Laravel APIに記載してあります。
Illuminate\Queue\Events\JobProcessing | Laravel API
以下のようなコードで、ログを出力させることができます。
// ジョブが処理される前に実行される
Queue::before(function (JobProcessing $event) {
Log::channel("queue")->debug("Job Before", [
"Queue Name" => "{$event->job->getQueue()}",
"Body" => "{$event->job->getRawBody()}"
]);
});
Queue::after
// ジョブが処理された後に実行される
Queue::after(function (JobProcessed $event) {
// $event->connectionName
// $event->job
});

Queueファサードのafterメソッドを使って、キューに投入されたジョブが処理された後に実行するコールバックを指定することができます
引数には、JobProcessedを指定。JobProcessingと同様、connectionNameやjobインスタンスを取得することができます。詳細は、Laravel APIに記載してあります。
Illuminate\Queue\Events\JobProcessed | Laravel API
以下のようなコードで、ログを出力させることができます。
// ジョブが処理された後に実行される
Queue::after(function (JobProcessed $event) {
Log::channel("queue")->debug("Job After", [
"Queue Name" => "{$event->job->getQueue()}",
"Body" => "{$event->job->getRawBody()}"
]);
});
Queue::failing
// ジョブが失敗した時に実行される
Queue::failing(function (JobFailed $event) {
// $event->connectionName
// $event->job
// $event->exception
});

Queueファサードのfailingメソッドを使って、キューに投入されたジョブが失敗した時に実行するコールバックを指定することができます
引数には、JobFailedを指定。connectionNameやjobインスタンス、それからexceptionを取得することができます。詳細は、Laravel APIに記載してあります。
Illuminate\Queue\Events\JobFailed | Laravel API
以下のようなコードで、ログを出力させることができます。
// ジョブが失敗した時に実行される
Queue::failing(function (JobFailed $event) {
Log::channel("queue")->error("Job Failing", [
"Queue Name" => "{$event->job->getQueue()}",
"Error Message" => "{$event->exception->getMessage()})",
"Error Line" => "{$event->exception->getFile()}) line {$event->exception->getLine()}",
"Stack Trace" => "{$event->exception->getTraceAsString()})"
]);
});
まとめ|LaravelのQueueファサードを使って、ジョブの実行履歴をログに出力する方法
ここまで、「LaravelのQueueファサードを使って、ジョブの実行履歴をログに出力する方法」について書いてきました。

説明してきたように、Queueファサードのbefore・after・failingメソッドなどを使って、任意のタイミングで、ジョブの実行履歴をログに出力させることができます!
コメント