PHP
laravel
monolog
lumen

Lumenでpasswordの中身をマスクしてログに出力する

やりたいこと

ログを出すときに、ユーザから送られてきたパスワードや、パスワード確認にセットされているパスワード文字列がログに書かれてしまうのをなんとかする。
個別に処理するのではなく、logを出す方で自動的にマスクして出力するようにする。

前提

PHP 7
Lumen 5
ログに monologを使っている

やりかた

bootstrap/app.php
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Monolog\Handler\NativeMailerHandler;
use Monolog\Formatter\JsonFormatter;


   :
   (割愛)
   :

$app->configureMonologUsing(function ($monolog) {
    $monolog->pushHandler((
        new StreamHandler('php://stdout', Logger::DEBUG)
    )->setFormatter(new JsonFormatter()));

    $monolog->pushProcessor(function($record){
        array_walk_recursive($record, function(&$val, $key){
            if (($key === 'password')||($key === 'password_confirmation')) {
                $val = '********';
            }
        });
        return $record;
    });
    return $monolog;
});


   :
   (割愛)
   :


\Monolog\Logger::StreamHandler では、
第一引数 : php://stdout 標準出力
第二引数 : Logger::DEBUG デバックレベルで出力する
setFormatter(new JsonFormatter())) : JSON形式で出力する

の設定になっている(AWS CloudWatch Logs に出す想定)

ログ出力内容を変更したり追加したりする場合は、\Monolog\Logger::pushProcessorを使う。
ここに、既存の processrを追加したりしてとても便利だったりする。

独自のコールバックを書くこともできる。
引数の $record に、ログに書き出す内容の配列が渡されるので、その中の password, password_confirmation の値を ******** に上書きする処理にする。

array_walk_recursive は、第一引数に指定した配列の全ての要素に、ユーザー関数を再帰的に適用してくれる便利なやつ。

感想

でも遅くなりそうな予感。