LaravelでQueueのジョブ完了イベントを使ってログ履歴を残す

LaravelでQueueのジョブ完了イベントを使ってログ履歴を残す

記事一覧LaravelでQueueのジョブ完了イベントを使ってログ履歴を残す

Laravel の Queue のリスナーは便利なのですが、ジョブの失敗は failed_jobs テーブルなどに残せるものの、逆にジョブの実行に成功した場合の履歴が残しにくい作りになっています。

ただ、一応、ジョブ実行成功時の機構は用意されていて、ServiceProvider クラスでコールバックを受け取ることができます。

実際に職場で実装してみて問題なく使えたので、他のバージョンを含めて振り返ってみます。

実際に Laravel はバージョン 5.1 が LTS(Long Term Support)で、次の LTS が 5.5 なので、5.2~5.4 については触れなくてもいいかもしれませんが・・・。

class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        Queue::after(function($connection, $job, $data) {
            //
        });
    }

boot メソッドの中に Queue::after() にコールバック関数が定義できるので、ここでログ出力することでジョブの成功を履歴に残すことができます。

Laravel5.2 からは引数が「JobProcessed $event」だけになっているので、5.1 のこれは使い勝手が悪かったのでしょうか。

ジョブ完了イベント - Laravel5.1

目次

ジョブ名の取得

まず、どのジョブが実行されたのかを確認するには、3 番目の引数の $data から該当のジョブクラスを特定します。

ジョブのクラス名だけであれば、強引に以下で取得できなくもないですが、$job 変数からあっさり取れるってこともあるかも。

$command = unserialize($data['data']['command']);
$class_name = get_class($command);
$job_name = str_replace('App\\Jobs\\', '', $class_name);

っと思ってみたのですが、$job のオブジェクトにはそのような振る舞いは実装されていないので、$command からジョブのクラスで用意した実装を活かすのが良さそうです。

例えば、各ジョブのクラスに必要な情報が取得できるような public なメソッドを実装しておけば、上記 $command 変数から参照が可能になります。

これを利用して履歴として残しておきたい情報を受け取るのも 1 つの方法かなと思います。

// 該当のジョブクラスから必要な情報を受け取る
$log = $command->getHoge();
echo $log['id'] . PHP_EOL;
echo $log['name'] . PHP_EOL;
// ジョブクラスには必要な情報を渡すメソッドを実装しておく
class HogeJob extends Job implements ... {

    private $log;

    (省略)

    public function handle() {

        (省略)

        // 処理の最後に必要な情報を設定
        $this->log['id'] = $id;
        $this->log['name'] = $name;
    }

    public function getHoge() {
        return $this->log;
    }

参考カテゴリ

エンジニア記事一覧

最新の投稿やよく見られているのオススメ記事一覧です。