PHP

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

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

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

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

Queue::after

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

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

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

ジョブ名の取得

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

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

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

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

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