わざわざログファイル見に行くのがめんどくさい
エラー起こったときにわざわざサーバーに見に行くのめんどくさいじゃないですか。
なんでライブラリMonologを使ってログファイルに書き出しつつもSentryへもその内容を飛ばしてスマホからとかでもエラー内容を確認できるようにしてみます
Monologの導入
composer
でインストール
$ composer require monolog/monolog
※composer(PHPのパッケージマネージャー)入れてない場合は先に入れてください
呼び出しつつ出力先とログレベルを指定する
<?php
require_once __DIR__.'/vendor/autoload.php';
$log = new \Monolog\Logger('app');
// ここではログレベルをWARNING以上の場合にログ出すように設定
$log->pushHandler(new \Monolog\Handler\StreamHandler('/app.log', \Monolog\Logger::WARNING));
設定できるレベルは以下の通り
Log Levels
Monolog supports the logging levels described by RFC 5424.DEBUG (100): Detailed debug information.
INFO (200): Interesting events. Examples: User logs in, SQL logs.
NOTICE (250): Normal but significant events.
WARNING (300): Exceptional occurrences that are not errors. Examples: Use of deprecated APIs, poor use of an API, undesirable things that are not necessarily wrong.
ERROR (400): Runtime errors that do not require immediate action but should typically be logged and monitored.
CRITICAL (500): Critical conditions. Example: Application component unavailable, unexpected exception.
ALERT (550): Action must be taken immediately. Example: Entire website down, database unavailable, etc. This should trigger the SMS alerts and wake you up.
EMERGENCY (600): Emergency: system is unusable.
Sentryの導入
サイトで登録まで済ます
以下から登録する(GitHubアカウントあれば楽です)
発行されたURLを確認する
https://***********************.ingest.sentry.io/*****
みたいなURLが発行されるので確認しておく
(Projects
とかの設定も済ませておく)
PHP SDKをcomposer
でインストール
composer require sentry/sdk
この時点でcomposer.json
は以下の感じになってるはず
{
"require": {
"monolog/monolog": "^2.2",
"sentry/sdk": "^3.1",
}
}
二つを合わせて実装してみる
上で設定したMonologとSentryを入れて強制的に例外発生させて動きを確認してみます
実装例
<?php
require_once __DIR__.'/vendor/autoload.php';
// Sentry setup (URLはSentry登録後に発行されるやつを書く)
Sentry\init(['dsn' => 'https://***********************.ingest.sentry.io/*****']);
try {
// Logger
$log = new \Monolog\Logger('app');
$log->pushHandler(new \Monolog\Handler\StreamHandler('/app.log', \Monolog\Logger::WARNING));
throw new \Exception("テスト用のエラー"); // ここでわざと例外発生させてみます
return;
} catch (\Throwable $exception) {
// ログをファイルに出力しつつ
$log->error($exception);
// Sentryへも飛ばす
Sentry\captureException($exception);
}
ログファイルに書き込まれているか確認
↓こんな感じでログファイル(例ではapp.log
)に出力される
[2021-02-27T12:47:56.704675+09:00] app.ERROR: Exception: テスト用のエラー in C:\work\test\index.php:10 Stack trace: #0 {main} [] []
Sentry上にエラー内容が送信されているか確認
うまくいくと左メニューにあるIssues
に以下のようなエラーが表示される
おわり
- 自分は遊びで作ったやつに入れたんで特に設定してないですけどSlackとかにも飛ばせるみたいです
- それはそうと久しぶりにPHP書くと楽しかった(こなみかん)