monologを使用して、ログの取得・記録の機能を追加することになったので、備忘録としてまとめます。
##monologとは
phpのロギングのためのライブラリ。
ハンドラーによって、ファイル・メール受信・ソケット・データベースといった様々なWebサービスに記録することが可能。
PSR-3のインターフェースを実装している。
そのため、PSR-3を使用するフレームワークでは利用が容易。Symfony、Laravelでは標準で実装されている。
##monologの導入
基本的な使用方法のまとめ
####インストール
composerを使用してインストール
$ composer require monolog/monolog
上記を実行
または
{
"require": {
"monolog/monolog": "^2.02"
}
}
composer.jsonに記述し、インストール
$ composer inastall
####使いかた
基本的な使い方は以下の通り
(monologのドキュメントより引用)
<?php
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
// create a log channel
$log = new Logger('name');
$log->pushHandler(new StreamHandler('path/to/your.log', Logger::WARNING));
// add records to the log
$log->warning('Foo');
$log->error('Bar');
まず、チャネル(Loggerインスタンス)を作成する。
インスタンス作成時にチャネル名を引数として渡す(上記の場合'name')。チャネル名はログの場所に合わせて付けることで、複数のLoggerがある場合に抽出するなどの操作が容易になる。
作成したチャネルにpushHandlerでログの目的に合わせてハンドラーをセット。
StreamHandlerはmonologでファイル記録用の基本的なハンドラー。
上記の場合、第1引数はログを記録するファイルのパス、第2引数はログレベル(ログレベルの初期値はLogger::DEBUG)
ハンドラは複数持たせることができるので、複数の記録の機能を持たせることができる。
ログの記録の際は、レベルを指定できる。上記ではwarningレベルでFooを、errorレベルでBarを書き込みしている。
###やってみた
今回やりたかったこと、「APIからのレスポンス結果($result)を一定期間分ファイルに記録する」を試してみた。(レスポンス結果の取得については割愛)
ハンドラーはStreamHandlerを継承したRotatingFileHandlerを使用。
RotatingFileHandlerは1日に1つのログファイルを作成、古いファイルは削除することができるので、一定期間のログを残す場合に便利。
use Monolog\Logger;
use Monolog\Handler\RotatingFileHandler;
-----------
// Create a handler
$handler = new RotatingFileHandler('/logs/response', 30);
// create a log channel
$log = new Logger('response');
$log->pushHandler($handler);
// add records to the log
$logger->info(json_encode($result,JSON_UNESCAPED_UNICODE));
logsフォルダにresponseというファイル名で、30日分の記録を保存するようにハンドラーを設定。
infoレベルでログを記録(レスポンスがjson形式で返ってくるので、json_encodeしている)。
結果、logsフォルダにはlogs\response-2020-03-31といった日付ごとのファイルが作成された。
ファイルの中には日時、チャネル名、ログレベル、ログ内容 の順で記録される。
↓ファイル内はこんな感じで記録されます
[2020-03-31 14:55:18] response.INFO: {"response":"{\"records\":[{\"date.............
[2020-03-31 14:55:20] response.INFO: {"response":"{\"records\":[{\"date.............
##monologを試してみて
今回は簡易的な内容で試したが、もともとmonologはかなり高機能なロギングのライブラリなので、
ハンドラーに持たせるフォーマッターで出力形式もいろいろなものが選択でき、プロセッサーでログレコードに追加などの操作もできる。
使いこなすことができれば、かなり便利そうだなという印象でした。