実践知識

Laravelでのデバッグのやり方について(Logファサード編)

Laravelでは様々なデバッグが用意されています。

その中でも特にオススメなのがLogファサードを使ったデバッグです。

今回はLogファサードを使ったデバッグについてエントリーいたします。

 

使い方

使い方は簡単です。

Log::debug('デバッグメッセージ')

デバッグメッセージに確認したい変数や配列などを入れてログファイルを確認します。

 

設定

まずは.envファイルでAPP_DEBUGがtrueであることを確認します。

【 解説 】
デフォルトではAPP_DEBUGの値はtrueになっています。
本番サーバーではfalseを推奨しています。

デバッグしたい箇所にLogファサードを記述するとログの出力先は標準ログ(storage/logs/laravel.log)に記述されます。

しかしデフォルトの設定だと単一ファイルでログローテーションがありません。

【 解説 】
ログローテーションとは
一定の期間を過ぎたログを削除したり、ログデータの総量が一定の容量を超えたら最も古いログを削除したりする機能

デバッグでLogファサードを頻繁に利用するなら変更することをお勧めします。

config/app.php を編集します。

  /*
  |--------------------------------------------------------------------------
  | Logging Configuration
  |--------------------------------------------------------------------------
  |
  | Here you may configure the log settings for your application. Out of
  | the box, Laravel uses the Monolog PHP logging library. This gives
  | you a variety of powerful log handlers / formatters to utilize.
  |
  | Available Settings: "single", "daily", "syslog", "errorlog"
  |
  */

  //'log' => env('APP_LOG', 'single'),
     'log' => env('APP_LOG', 'daily'),
設定値 内容 備考
single storage/log/laravel.logに出力する 単一ファイルでログローテーションは無い
daily storage/log/laravel-YYYY-MM-DD.logに出力する 1ファイルに1日分のログが出力される 。(デフォルトでは5日分 )
log_max_files dailyの追加設定。daily設定時のログファイル保存期間を変更できる
'log' => 'daily',
'log_max_files' => '10',

config/app.phpの変更をしたら

php artisan config:cache

を実行します。

【 解説 】
configの変更をしたら上記のコマンドを実行します。
そのままだと、キャッシュの方が読み込まれて反映されません。

では、実際にLogファサードを使ってデバッグ作業をやってみます。

 

チュートリアル

シナリオ

以前やった「複数キーワード検索 + ページャー機能」のデバッグ作業をやってみます。

コントローラのファイルが対象になります。

ポストで送られた値(検索キーワード)とSQLの文(検索結果)をログファイルに出力します。

 

実装作業

コントローラ

use Log;

class EmployeeController extends Controller
{
  //一覧
  public function select(Request $req){

  // 値を取得
  $dept_name = $req->input('dept_name');
  $pref = $req->input('pref');

  // DEBUG
  Log::debug('$dept_name="'.$dept_name.'"');
  Log::debug('$pref="'.$pref.'"');

  // 検索QUERY
  $query = Employee::query();

  // 結合
  $query->join('depts', function ($query) use ($req) {
  $query->on('employees.dept_id', '=', 'depts.id');
  });

  // もし「部署名」があれば
  if(!empty($dept_name)){
  $query->where('dept_name','like','%'.$dept_name.'%');
  }

  // もし「都道府県」があれば
  if(!empty($pref)){
  $query->where('address','like','%'.$pref.'%');
  }

  // ページネーション
  $employees = $query->paginate(5);

  // DEBUG
  $employees_sql = $query->toSql();
  Log::debug('$employees_sql="'.$employees_sql.'""');

  // ビューへ渡す値を配列に格納
  $hash = array(
  'dept_name' => $dept_name, //pass parameter to pager
  'pref' => $pref, //pass parameter to pager
  'employees' => $employees, //Eloquent
  );

  return view('employee.list')->with($hash);
  }
【 POINT 】
冒頭箇所、useでLogのエイリアスを作成するのを忘れずに!

 
Log出力ファイル

ブラウザにアクセスして「開発」「大阪」で検索。

Logファサードで出力されたファイルを確認します。

このように、問題がありそうな箇所にLogファサードを入れていくことで、どこに問題があるか、すばやく特定することができます。

Logファサードを使ったデバッグ作業は以上です。

 

-実践知識