5
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

LaravelのLogを思いのままに出す

Posted at

Laravelではログを簡単に出力する仕組みが準備されている。
とりあえずLogファザードを使えば、ログレベル別のメッセージを簡単に出力できる。
でも、それだけじゃちょっと困るのだ。
例えば、だれがいつアクセスしたか、いわゆるアクセスログにはキーとなる情報が欲しいし、エラーログはなるべくすぐにエラー個所にたどり着けるよう、エラー情報に特化したログのほうがいい。
じゃあ、そんな風に自由にLOGを出せるよう、れっつlaravel!
ごめんねノーサイドゲームの再放送見ちまったかられっつラグビーと絡んじゃってつい書いちゃった。

#1.出力先を分けてみよう
通常のLOGは/storage/logs/laravel.logに出力されるけど、エラー分だけエラーログに、アクセス情報はアクセスログに出したい。
そんな設定は、config/logging.phpの中で設定している。
logging.phpは微妙に長いが、書かれていることは非常にシンプルです。
☆基本どういう出し方をするか?
defaultで設定します。

logging.php
'default' => env('LOG_CHANNEL', 'stack'),

デフォルト.envの中のLOG_CHANNELを持ってくるが、省略時はstackだよ、と言っている。
.envの中はこんな感じ。

.env
LOG_CHANNEL=stack

同じじゃん。単にsingleとかdailyとかにしたいだけなら、.envを変更するだけでログの出力設定を変更できる。

logging.phpの次の設定は、Log Channelだ。
ここには具体的なログの取り方を指定する。
最初に書いてある「stack」はちょっと特殊な扱いで、stackの中にあるchannelsにLog Channelを記述すると、その設定のログを取ってくれる。ここに複数のログを指定することが可能なので、取りたい種類のLog Channelをがつがつ書いていけばいいってことだね。
その下に書かれている「single」以下のchannelが、実際にログを出力する内容の部分だ。どれがどんなログを出しているか知りたい人は適当にググってくれ。結構当たるぞ。
さて、Channelの中にerrorlogあるじゃん。これを出すか?

logging.php
'errorlog' => [
            'driver' => 'errorlog',
            'level' => 'debug',
        ],

なんか、他のに比べてシンプルだね。
それもそのはず、errorlogはphpのerror_logのことだって。出力先はphp.iniで設定するんだって。
なんかなー。せっかくだから、laravel内で完結したいなー。
なので、自分でChannel追加しました。

logging.php
'myerror' => [
    'driver' => 'single',
    'path' => storage_path('logs/myerror.log'),
    'level' => 'error',
],

とりあえずmonologをStreamingHandlerで出力、レベルはエラーとしたよ。
ついでだから、アクセスログ用のChannelも作っちゃおう。調子乗っちゃって。

logging.php
'myaccess' => [
    'driver' => 'single',
    'path' => storage_path('logs/myaccess.log'),
    'level' => 'info',
],

で、これらをstackに設定する。

logging.php
'stack' => [
            'driver' => 'stack',
            'channels' => ['myaccess','myerror'],
            'ignore_exceptions' => false,
        ],

本当はinfoレベルだけしか出したくないとか、加工するべきところはいろいろあるのだけれど、まずはお手軽に行きます。
設定はこんなもんで。

#2.出力内容をカスタマイズしよう
アクセスログには、どんなアクセスがあったか、キーになる情報を出したい。例えば、
・日時
・顧客番号
・端末番号
・どんな動作かわかる情報 とりあえずgetとかpostとか
とりあえずサンプルなので、こんなもんでどうでしょう。
これらの項目を自力で出します。
LOGの出力は、LOGファザードを使用します。
書き方はこんな感じ

Log::info('post receipt id:'.$receipt_id.
            ' company id:'.$request->input('company_id').
            ' terminal id:'.$request->input('terminal_id'));

出力されるのが、こんな感じ。

[2020-06-11 22:33:19] local.INFO: post receipt id:7 company id:1 terminal id:1-1-557

真剣にフォーマットしたり、JSONで出力してelasticsearchに食わせたりしたらもっと愉快なLOG LIFEになると思うが、それはおいおい。
おいおい、じゃないよ、追々だよ。
それではその日まで、あでぃおす、あみーご!!

5
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?