Search

検索したいワードを入力してください

2019年04月09日

Laravelの設定方法やカスタマイズについて解説

Laravelでは、利用者の用途に応じて、log出力の設定を変えることができます。Laravelで使用するlogのレベルを条件によってコントロールすることも可能です。システムの運用や保守を円滑に行うためにも、log出力のコントロール方法を覚えておきましょう。

LaravelのLogの設定方法やカスタマイズについて解説

Laravelには、log出力するための設定記述の方法が複数あります。logの出力場所に応じて、設定者が意図する内容で出力できます。

【log出力設定の記述方法】
・Log ファサードを使用
・helper の logger() を使用
・helper で logs() を使用
・helper を使用

ここでは、Laravelでlog出力の設定を行う方法とカスタマイズの内容についてみていきましょう。

設定の方法

Laravelでは、logメッセージをファイルやシステムエラーログ、Slack通知などのlogサービスを提供しています。Laravelでは、Monologライブラリーを活用し、log出力を可能とします。

Laravelでlogシステムの設定をする際は、必要な設定はすべてconfig/logging.php設定ファイルに用意されています。Laravelのデフォルト設定では、stackチャンネルをログ出力に使用します。

チャンネルの設定にnameオプションを追加する

Laravelで活用するMonologは、デフォルトでは現在の環境と一致する「チャンネル名」でインスタンス化されます。インスタンス化の際のチャンネル名を任意に変更する場合は、nameオプションを追加します。

【コード記述例】
'stack' => [
'driver' => 'stack',
'name' => 'Mychannel',
'channels' => ['single', 'slack'],
],

利用可能なチャンネルドライバまとめ

Laravelで利用可能なチャンネルドライバには以下のようなものがあります。先のコード記述例では、「stack」ドライバを使っています。コード記述例と同じように、必要なチャンネルドライバを「'driver' =>《ドライバ名》」の形で記述します。

ドライバ名内容
customチャンネル生成時に、指定したファクトリを呼び出す
dailyRotatingFileHandlerの毎日ファイルを切り替えるMonologドライバ
errorlogErrorLogHandlerベースのMonologドライバ
monologサポートしているMonologハンドラであれば、どれでも使用できる、Monologファクトリドライバ
singleシングルファイル・パスベースのロガーチャンネル
slack「マルチチャンネル」を作成するためのラッパー機能
stackSlackWebhookHandlerベースのMonologドライバ
syslogSyslogHandlerベースのMonologドライバ

ログスタックの構築

コード記述例にも例示したstackドライバーは、複数チャンネルをひとつのログチャンネルへまとめるときに使うドライバです。

以下の設定例では、syslogに関するチャネルとslackに関するチャネルを、stackによりひとまとめのチャネルとして扱う設定になっています。

設定例

'channels' => [
'stack' => [
'driver' => 'stack',
'channels' => ['syslog', 'slack'],
],
'syslog' => [
'driver' => 'syslog',
'level' => 'debug',
],
'slack' => [
'driver' => 'slack',
'level' => 'critical',
   ≪~ 中略 ~≫
],
],

debugメソッドを使用し、メッセージをログする

この設定例では、syslogとslackチャンネルいずれの設定の中にも、level設定がされています。level設定は、チャンネルでlog出力するレベルの指定です。指定したレベル以上のレベルを持つlogが出力されます。

設定例のようにlevel設定をしたうえで、debugメソッドを使用し、デバッグログを出力してみましょう。

【コード記述例】
Log::debug('An informational message.');

debugメソッドとlevel設定の関係

設定例では、syslogチャンネルは、level設定がdebugとなっているので、debugメソッドを使って出力するメッセージも、システムログへ出力されます。

しかし、slackチャネルでは、level設定がcriticalとなっているので、criticalより低いレベルのdebugメッセージは、Slackチャネルからは出力されません。

logの出力レベル出力レベルの位置づけ
emergencyシステムが使用不可能な状態
alert直ちになんらかの対処が必要
critical危機的な状態
error直ちに対処する必要のない実行時エラー。ログに記録して監視すべき
warningエラーではない例外的なできごと
notice正常だが重要な事象
info情報
debug詳細なデバッグ情報

ログメッセージの記述

定義したチャネルへの出力logのレベルを決めたら、そのレベルに応じたメソッドを使って、log出力を試してみましょう。

Laravelでは、config/logging.php設定ファイルで定義されているデフォルトログチャンネルへ、logメッセージが出力されます。

ログメッセージレベルに応じたメソッドを呼び出す

Laravelでは、logの出力レベルに応じた出力メソッドが用意されています。メソッドの使い方は、いずれのレベルでも同じで、引数として出力するメッセージを指定します。

【log出力基本構文】
Log::≪ログメッセージレベルのメソッド≫(logメッセージ);

【コード記述例】
Log::info('Created by '.$id);

log出力レベル出力メソッド
emergencyLog::emergency($message);
alertLog::alert($message);
criticalLog::critical($message);
errorLog::error($message);
warningLog::warning($message);
noticeLog::notice($message);
infoLog::info($message);
debugLog::debug($message);

logメソッドは複数メッセージの出力も可能

logメソッドには、出力するメッセージとして配列を渡すことも可能です。配列として渡した情報は、Laravelによりlogメッセージに整形されて出力されます。

【コード記述例】
Log::info('User failed to access.', ['id' => $user->id]);

指定チャンネルへの記述

log出力の場面や状況によっては、アプリケーションとしてのデフォルトチャンネルだけでなく、別のチェンネルへlogメッセージを出力したい場合もあります。

Laravelのlog出力においては、設定ファイルに定義してあるチャンネルをLogファサードのchannelメソッドで取得することで実現可能となります。

【コード記述例】
Log::channel('slack')->info('Check!');

Logファサードのchannelメソッドを使い取得する

Logファサードのchannelメソッドを使い、使用するチャンネルの切り替えを行う場合は、例示したコード記述のほか、複数チャンネルをまとめるstackメソッドを使うことも可能です。

【stackメソッドを使ったコード記述例】
Log::stack(['single', 'slack'])->info('Check!');

Monologチャンネルの上級カスタマイズ

LaravelではMonologチャンネルを活用していますが、アプリケーションの開発過程では、デフォルトのチャンネルではなく、アプリケーションの機能などに応じてカスタマイズが必要となる場合もあります。

LaravelのMonologチャンネルに対し、以下のようなカスタマイズが可能です。

・チャンネル用Monologカスタマイズ
・Monologハンドラチャンネルの作成
・ファクトリを用いたチャンネル生成

チャンネル用Monologカスタマイズ

指定したチャンネルハンドラに対し、Monologのカスタマイズ実装する場合は、チャンネルの設定の中で、tapキーを定義します。tapキーに拡張用のクラスを指定することで、チャンネルの Monolog のインスタンスを拡張できます。tap キーは、配列で複数のクラスが登録可能です。

チャンネルに対するtapオプションを定義する

チャンネルハンドラを拡張する場合は、以下のようにtapキーを使って、拡張クラスを指定します。以下のコード記述は、単純に拡張クラスのみを指定しています。実際の開発の中では、次の項でご紹介するチャンネル定義例のtapキーのように、詳細を指定することができます。

【コード記述例】
'tap' => [App\Logging\LoggerCustomize::class],

【コード記述例】
'channels' => [
  'daily' => [
   'driver' => 'daily',
   'level' => 'debug',
   'days' => 7,
   'tap' => [
    App\Logging\LoggerCustomize::class . ':' . implode(',', [
    '[%datetime% .%level_name%] %message%     [%extra.class%::%extra.function%(%extra.line%)【ip:%extra.ip%】]'
    .PHP_EOL,'H:i:s.v'
   ]),
  ],
],

__invokeメソッド

チャンネルに対してtap定義が完了したら、カスタマイズするクラスに__invokeメソッドを追記します。

【追記が必要なコード部分】
class 《tapで指定したクラス》
{
public function __invoke(クラスに応じた引数): void
{
  《処理記述》
}
}
}

コード記述例
class LoggerCustomize
{
  public function __invoke(Logger $monolog, string $logFormat, string $dateFormat): void
  {
   $formatter = new LineFormatter($logFormat, $dateFormat, true, true);
   $ip = new IntrospectionProcessor(Logger::DEBUG, ['Illuminate\\']);
   $wp = new WebProcessor();
   foreach ($monolog->getHandlers() as $handler) {
    $handler->setFormatter($formatter);
    $handler->pushProcessor($ip);
    $handler->pushProcessor($wp);
   }
  }
}

Monologハンドラチャンネルの作成

Laravelで活用しているMonologは、各種のハンドラーを追加することで、logの出力先を追加・変更できる仕組みになっています。

Monologドライバーを使用したMonologのハンドラチャネルを指定する際は、handler設定オプションを使います。作成するハンドラーに任意のコンストラクタパラメータを指定する際は、handler_with設定オプションを使います。

monologドライバーを使用する

monologドライバーを使って新たなチャンネルを設定する場合、チャンネル設定のコード記述は、以下の例のようになります。

【コード記述例】
'driver' => 'monolog',
'handler' => 《使用するMonologドライバー》:class,
'handler_with' => [《設定するオプション》,…, ],

Monologフォーマッターの利用

monologドライバーを使用する際は、Monolog LineFormatterがデフォルトフォーマッターとなります。フォーマッターのタイプについてもカスタマイズが必要な場合は、formatterとformatter_with設定オプションを使用することで、ハンドラー同様のカスタマイズが可能です。

コード記述例
'driver' => 'monolog',
'handler' => 《任意のハンドラー指定》::class,
'formatter' => 《任意のフォーマッター指定》::class,
'formatter_with' => [
    'dateFormat' => 'YYYY-mm-dd',
],

ファクトリを用いたチャンネル生成

Laravelのlog出力において、自身でMonologのインスタンスを作成する場合は、config/logging.php設定ファイルで、driverに「custom」を指定します。独自のインスタンスを作成する場合の代表的なキーにviaがあります。

viaには、CreateCustomLoggerなどの拡張用クラスを指定します。viaのほかにも、拡張用クラスに渡す引数となるものを指定できます。

viaオプションを設定に含める

viaをlogging.phpの設定に含めるコード記述例をご紹介します。以下の例では、viaで拡張クラスを指定し、以下、引数となるキーと設定値を記述しています。

コード記述例のlog出力環境は、通常は info レベルでログを出力し、 error レベル以上ではdebug レベルのログも出力する、という設定になります。

コード記述例
'channels' => [
   'newlog' => [
     'driver' => 'custom',
     'via' => App\Logging\FingersCrossedLogger::class,
     'path' => storage_path('logs/laravel.log'),
     'level' => 'debug',
     'activation' => 'error',
     'pass' => 'info',
   ],
],

Laravelのlog出力環境をカスタマイズしてみよう!

Laravelでは、デフォルトの環境でもlog出力は可能ですが、出力レベルを変えてみたり、出力先に応じて、出力レベルを変えてみたりといったカスタマイズは、あまり複雑な設定を必要とせず、対応可能となっています。

構築したシステムのトレースを臨機応変に記録するためにも、Laravelのlog出力環境のカスタマイズ方法を覚え、システムの運用や保守に活用しましょう。

【PR】多くの人がプログラミングを諦めてしまう理由をご存知ですか?



近年プログラミングを勉強する人が増えています。

プログラミング学習者の多くは独学から取り組もうとしますが、だいたい80%ほどは3ヶ月も続かずに諦めてしまいます。早い人は1日目で。

多くの人がプログラミングを独学しようとして諦める理由は、次の3つ。
●モチベーションが維持できない
●エラーの原因・解決方法が分からない
●どう学習すればよいか分からない

TechBoostというプログラミングスクールでは、みんなと一緒にプログラミングをするのでモチベーションの維持ができ、分からないことがあればマンツーマンで教えてくれ、徹底的に研究された初心者向けの教材が揃っています。

TechBoostを卒業後、実際にエンジニアとして転職した方もいるほど。

本気でプログラミングを学びたい方は、一度無料のカウンセリングでご相談ください。プログラミングを嫌いになる前に。

tech boostについて

オーダーメイド型の学習コンテンツを提供する「tech boost」 は、エンジニアのキャリア支援に特化したサービスを複数展開している株式会社Branding Engineerが運営しているプログラミングスクールです。最短3ヶ月間で、未経験から『プログラミングの基礎』、『実際に業務で必要となるスキル』、『今のトレンドとなっている知識』まで学べ、ご希望の方にはプロのキャリアアドバイザーによる就業支援を行うことができます。

tech boost卒業生インタビュー

tech boostの卒業生の声を聞きました。あなたがプログラミングを学びたい理由を、一度考えてみてください。
営業→Javaエンジニア→Rubyエンジニアと転向し、第一志望のFinTech企業で働く山下さん
元営業、ビジネスのわかるエンジニアを目指す菅原さん
サンフランシスコに交換留学し、シリコンバレーのVCでインターン中の梅本さん
予備校の営業から半年でエンジニア転職を果たした小田島さん

tech boostの口コミ



Related