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;
    }

参考カテゴリ

オススメ記事

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

AmazonLinuxでEC2起動時にスワップ領域の割り当てに失敗

EC2 起動時のスワップ領域割り当てですが、これまでは以下の記事を参考に、/etc/rc.local を使って行っていました。 ・ Amazon EC2(Linux)のswap領域ベストプラクティス しかし、最近になって、EC2 イン...

>>記事を確認する

【5分でできる】Laravel5.4から5.5へバージョンアップ

Laravel5.5 がついにリリースされたので、5.4 ベースで作っていたものをバージョンアップしてみました。 composer.json の以下の部分を 5.5.* に変更するだけですが、依存関係のパッケージも問題なくアップデ...

>>記事を確認する

【30分でできる】AWSのEC2にgoofysを入れてS3をマウント

過去に携わったプロジェクトで、S3FS の通信状態が悪い時があるので、アプリ側のプログラムを AWS SDK を使ったものに置き換えていこうという施策がありました。 S3FS の導入には関わっていなかったので、導...

>>記事を確認する

【30分でできる】ぐるなびAPIで飲食店の店舗情報取得

過去に作成した「ぐるなびAPI」のプログラムや、ぐるなびの Web Service が新しくなったこともあり、API からの情報取得プログラムを書き換えてみました。 以前の記事は下記になります。 ・ ぐるなびAPIで...

>>記事を確認する

NginxのFastCGIキャッシュで白い画面がキャッシュされる

以前から、トップページにアクセスすると、レスポンスステータスは 200 で返ってくるのに、画面に何も表示されない現象が稀に見受けられたので調査してみました。 さすがに機会損失にも繋がるということで、...

>>記事を確認する

Laravel5.4の認証ユーザーのパスワードハッシュについて

Laravel で用意されている認証モジュールを利用する際、ユーザーモデル(User.php)経由で登録されるパスワードのハッシュ方法について調べてみました。 Laravel 上ではパスワード文字列を bcrypt() のヘルパー...

>>記事を確認する

Laravel5.4のコントローラコンストラクタでAuth::user()が取得できない

Laravel5.4 で認証を通したアクセスに対して、コントローラのコンストラクタでユーザモデルの値を取得しようと思ったら、なぜか Auth::user() の値が取得できなくて悩みました。 public function __construc...

>>記事を確認する

NginxのHSTS(HTTP Strict-Transport-Security)の設定

「Let's Encrypt」のおかげで、全サイト SSL 化していますが、これまで nginx の設定では、http のアクセスがあった場合に https に 301 リダイレクトさせていました。 この場合、Googlebot に http のアク...

>>記事を確認する

GoogleMapのAPIキーの認証情報にリファラURL設定

昔は API キーを指定することで、JavaScript で GoogleMap が表示できていましたが、何年か前に、そのキーに対して認証情報の追加が推奨されました。 新規で発行する場合は必須になっているかもしれませんが...

>>記事を確認する

【30分でできる】AmazonLinuxでApache2.4+php7.1+Laravel5.5

先日、「 VagrantでCentOS6.9のイメージを使う 」の通り、CentOS6.9 には Apache2.4 と PHP7.1 で Laravel のフレームワークが使える環境を構築しました。 ただ、将来的には AWS かつ Amazon Linux 上で動か...

>>記事を確認する