【初心者向けLaravel講座】ログ出力場所設定とDBクエリのログ出力方法

プログラミング

ログって何だろう?具体的な活用例が知りたい

こんな悩みに対して記事を書きました。


この記事を書いている私は、2019年4月、未経験からWebエンジニアに転身しました。

元未経験の視点でWebエンジニアに必要な知識やスキルをブログで発信しています。

前回の記事はこちら
https://kumatetsublog.com/shoot/blog/laravel-middleware-auth


今回は、以下の知識が学べます。

  • ログとは何か
  • ログ出力先の設定方法
  • (具体例)DBのクエリをログ出力する方法

ログとは

ログとはソフトウェアの動作を確認するメモみたいなものです。

当然、Webアプリ開発を進める上でログを活用することはとても重要です。

ログをうまく活用することでアプリケーションで発生している事象を確実に捕らえられるため、

開発スピードが上がったり、バグの早期発見といったことに役立ちます。


私の場合は、
バグりそうなところやテスト用にログを仕込んだり、

単純に動作確認のため埋め込んだりしています。

あとは今日紹介する、DBのクエリをログに書き出しています。


実は、Laravelではログ出力の場所が簡単に設定できます。

やり方をみていきましょう。

ログ出力場所設定

デフォルトではstorage/logs下にログは格納されますが、
ワークディレクトリにどんどんログファイルが溜まっていくのは少々気持ち悪いので、

ログ出力場所を異なる場所に変更します。

基本、ログに対する設定はconfigs/logging.phpに記載されています。

  • configs/logging.php
<?php

use Monolog\Handler\StreamHandler;
use Monolog\Handler\SyslogUdpHandler;

return [

    'default' => env('LOG_CHANNEL', 'stack'),

    'channels' => [
        'stack' => [
            'driver' => 'stack',
            'channels' => ['daily'],
            'ignore_exceptions' => false,
        ],

...省略...

        'daily' => [
            'driver' => 'daily',
            'path' => env('LOG_FILE_PATH_APP'),
            'level' => 'debug',
            'days' => 14,
        ],

...省略...

];

デフォルトの設定は、stack, dailyなので、
dailyの’path’を書き換えてログの出力場所を環境変数から取ります。

  • .env
LOG_FILE_PATH_APP="/var/log/shoot/laravel.log" // 追記


標準ログディレクトリ下に場所を切って、権限を書き込みも可にしてあげます。(shoot)

sudo mkdir /var/log/shoot
sudo chmod 777 /var/log/shoot

このディレクトリにログ出力されるようになります。

DBのクエリをログ出力する

さて、本題です。

Laravelアプリケーション実行中のDBクエリをログ出力するために、

AppServiceProviderに登録します。

  • app/Providers/AppServiceProvider.php
class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        // SQL LOG
        DB::listen(function($query) {
          $sql = $query->sql;
          for ($i = 0; $i < count($query->bindings); $i++) {
            $sql = preg_replace("/\?/", $query->bindings[$i], $sql, 1);
          }

          Log::debug("SQL", ["time" => sprintf("%.2f ms", $query->time), "sql" => $sql]);
        });
    }


アプリケーションで実行される各SQLクエリを取得したい場合は、listenメソッドが使用できます。このメソッドはクエリをログするときに便利です。

Logファサードのdebugで、SQL文とクエリ実行時間をLogファイルにデバッグ出力します。

LaravelではEloquentというDB操作を簡易的に記述できる便利な機能があります。

Eloquentを用いると、生のクエリが分からないのでSQL文とクエリ実行時間をログで確認できることは大変有益です。

クエリのログ設定はやるようにしましょう。



Logファサードはdebug以外にもログレベルを指定できるのですが、

私はdebug以外には、

Log::info(), Log::error()

らへんを使っています。それ以外は滅多に使っていません。






さて、以上がログ出力に関する記事でした。

個人でやるときはログなんてあまり意識しませんでしたが、

企業で開発するときは必須です。

ぜひ押さえておいてください。


それでは!

コメント

タイトルとURLをコピーしました