LaravelのQueueファサードを使って、ジョブの実行履歴をログに出力する方法

Laravel の Queue ファサードを使って、ジョブの実行履歴をログに出力する方法 Laravel
記事内に広告が含まれています。

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メソッドなどを使って、任意のタイミングで、ジョブの実行履歴をログに出力させることができます!

Laravel関連のおすすめ本・Udemy講座

コメント

タイトルとURLをコピーしました