Cloud Runのロギングに苦労しました。
サイトで色々検索をしても、あまり苦労しているような記事もなかったので、
なぜ出力されないのか不思議でした。

基本的にCloud Runのサービスまたはジョブからログ出力する場合は、

  • 標準出力(stdout)または標準エラー(stderr)ストリーム
  • /var/log ディレクトリにあるすべてのファイル
  • syslog(/dev/log)
  • Cloud Logging クライアント ライブラリを使用して作成されたログ
  • のいずれかであれば、Cloud Logging によってログが自動的に取得されます。

    しかし、Laravelのログ出力を標準出力にして動作させても出力されない事象が発生して、
    解決までにはまった話をしたいと思います。

    Laravelのログを標準出力させるためにapp/config/logging.phpに以下の記述を追記しました。

            'stdout' => [
                'driver' => 'monolog',
                'level' => env('LOG_LEVEL', 'debug'),
                'handler' => StreamHandler::class,
                'formatter' => GoogleCloudLoggingFormatter::class,
                'with' => [
                    'stream' => 'php://stdout',
                ],
                'processors' => [PsrLogMessageProcessor::class],
            ],
    

    なお、

    'formatter' => GoogleCloudLoggingFormatter::class,
    

    は、Cloud Loggingのフォーマットに合わせる方法になります。
    *別途PHP 用 Cloud Logging ライブラリのインストールが必要です。
    https://cloud.google.com/logging/docs/setup/php?hl=ja

    いざ、Cloud Runにデプロイして動作させてもCloud Loggingにログが出力されませんでした。
    ここから、解決までにかなり時間を要してしまいました。

     

    原因は、
    /usr/local/etc/php-fpm.d/docker.conf
    のファイルが存在していない事が原因でした。
    このファイルがないとDockerが標準出力してくれないようです。

    [global]
    error_log = /proc/self/fd/2
    
    ; https://github.com/docker-library/php/pull/725#issuecomment-443540114
    log_limit = 8192
    
    [www]
    ; php-fpm closes STDOUT on startup, so sending logs to /proc/self/fd/1 does not work.
    ; https://bugs.php.net/bug.php?id=73886
    access.log = /proc/self/fd/2
    
    clear_env = no
    
    ; Ensure worker stdout and stderr are sent to the main error log.
    catch_workers_output = yes
    decorate_workers_output = no
    

    なぜ、docker.confが存在していなかったのかはおいといて、
    docker.confを配置して動かすと無事にCloud Loggingにログが出力されました!

    もし、同じような現象に出くわした方は参考にしてもらえればと思います。

    いつもの事ですが、解決すると単純な事で悩んで時間を使ってしまったなと思います。