1
0

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.

【PHP】ロギングでファイルに出力しつつもSentryにもエラーログを飛ばしてWEBから見れるようにする

Last updated at Posted at 2021-02-27

わざわざログファイル見に行くのがめんどくさい

エラー起こったときにわざわざサーバーに見に行くのめんどくさいじゃないですか。
なんでライブラリMonologを使ってログファイルに書き出しつつもSentryへもその内容を飛ばしてスマホからとかでもエラー内容を確認できるようにしてみます

Monologの導入

composerでインストール

$ composer require monolog/monolog

composer(PHPのパッケージマネージャー)入れてない場合は先に入れてください

呼び出しつつ出力先とログレベルを指定する

index.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.

(引用:Using Monolog | monolog

Sentryの導入

サイトで登録まで済ます

以下から登録する(GitHubアカウントあれば楽です)

発行されたURLを確認する

https://***********************.ingest.sentry.io/*****みたいなURLが発行されるので確認しておく

Projectsとかの設定も済ませておく)

PHP SDKをcomposerでインストール

composer require sentry/sdk

この時点でcomposer.jsonは以下の感じになってるはず

composer.json
{
    "require": {
        "monolog/monolog": "^2.2",
        "sentry/sdk": "^3.1",
    }
}

二つを合わせて実装してみる

上で設定したMonologSentryを入れて強制的に例外発生させて動きを確認してみます

実装例

index.php
<?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)に出力される

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に以下のようなエラーが表示される
c988dbab-7fb4-46c2-bbd6-6bb06618f39a.png

おわり

  • 自分は遊びで作ったやつに入れたんで特に設定してないですけどSlackとかにも飛ばせるみたいです
  • それはそうと久しぶりにPHP書くと楽しかった(こなみかん)

参考URL

1
0
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?