ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
方法1: PHP 標準の error_log()
最も手軽な方法。php.ini の設定 or 直接ファイル指定でログを書きます。
// (1) php.ini の error_log 指定先へ出力
error_log("ユーザー登録失敗: id=$id");
// (2) ファイル指定(第2引数 3 = ファイル追記)
error_log("ユーザー登録失敗: id=$id\n", 3, "/var/log/app.log");
// (3) メール送信(運用ではほぼ使わない)
error_log("緊急", 1, "admin@example.com");
// 変数の中身を文字列化
error_log(print_r($data, true));
error_log(var_export($data, true));
error_log(json_encode($data, JSON_UNESCAPED_UNICODE));
php.ini の設定
; php.ini
log_errors = On
error_log = /var/log/php/error.log
error_reporting = E_ALL
display_errors = Off ; 本番は必ず Off
display_startup_errors = Off
; date 関数のタイムゾーン(ログ時刻に影響)
date.timezone = Asia/Tokyo
権限
# 書き込み権限を付与(Apache の場合)
sudo mkdir -p /var/log/php
sudo chown www-data:www-data /var/log/php
sudo chmod 750 /var/log/php
# nginx-php-fpm の場合
sudo chown www-data:www-data /var/log/php # ディストリ依存
方法2: set_error_handler でカスタム処理
PHP のエラー・例外・致命的エラーをすべてフックして独自処理する基盤:
// すべての E_NOTICE / E_WARNING / E_DEPRECATED を捕捉
set_error_handler(function (int $errno, string $msg, string $file, int $line) {
error_log(sprintf("[ERROR %d] %s at %s:%d", $errno, $msg, $file, $line));
// false を返すと PHP 標準処理も継続
return false;
});
// 未捕捉の例外をフック
set_exception_handler(function (\Throwable $e) {
error_log(sprintf("[EXCEPTION] %s\n%s", $e->getMessage(), $e->getTraceAsString()));
http_response_code(500);
echo "Internal Server Error";
});
// 致命的エラー(パースエラー以外)も検知
register_shutdown_function(function () {
$err = error_get_last();
if ($err && in_array($err['type'], [E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR])) {
error_log(sprintf("[FATAL] %s at %s:%d", $err['message'], $err['file'], $err['line']));
}
});
方法3: Monolog(業界標準)
PSR-3 準拠の高機能ロガー。Symfony / Laravel が内部で使っているデファクト:
composer require monolog/monologuse Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Monolog\Handler\RotatingFileHandler;
use Monolog\Handler\SlackWebhookHandler;
use Monolog\Formatter\JsonFormatter;
use Monolog\Processor\WebProcessor;
$log = new Logger('app');
// 通常ログ(日次ローテート、14 日保持)
$log->pushHandler(
(new RotatingFileHandler('/var/log/app.log', 14, Logger::INFO))
->setFormatter(new JsonFormatter())
);
// ERROR 以上だけ Slack 通知
$log->pushHandler(
new SlackWebhookHandler(
'https://hooks.slack.com/services/...',
'#alerts',
'AppBot',
true,
null,
false,
false,
Logger::ERROR
)
);
// リクエスト情報を自動付与
$log->pushProcessor(new WebProcessor());
// 利用
$log->info('ユーザー登録', ['user_id' => 123]);
$log->warning('API レート制限間近', ['remaining' => 5]);
$log->error('決済エラー', ['exception' => $e]);
$log->critical('DB 接続不可');
PSR-3 ログレベル
| レベル | 意味 | 使い分け |
|---|---|---|
debug | デバッグ詳細 | 開発時のみ |
info | 通常情報 | 正常動作の記録(ログイン等) |
notice | 注目に値する | 異常ではないが記録すべき |
warning | 警告 | 異常だが処理は継続可能 |
error | エラー | 処理失敗、即対応不要 |
critical | 致命的 | サービス品質悪化、要調査 |
alert | 緊急 | 即対応必要 |
emergency | システム停止 | システム使用不可 |
Laravel での Log facade
use Illuminate\Support\Facades\Log;
Log::info('注文作成', ['order_id' => $order->id, 'user_id' => $user->id]);
Log::warning('在庫低下', ['product' => $product->sku, 'stock' => 3]);
Log::error('決済失敗', ['exception' => $e]);
// channel 指定
Log::channel('payments')->info('Stripe success', ['amount' => 1500]);
// 一時的にスタック
Log::stack(['single', 'slack'])->error('障害');
config/logging.php
return [
'default' => env('LOG_CHANNEL', 'stack'),
'channels' => [
'stack' => [
'driver' => 'stack',
'channels' => ['daily', 'slack'],
],
'daily' => [
'driver' => 'daily',
'path' => storage_path('logs/laravel.log'),
'level' => env('LOG_LEVEL', 'debug'),
'days' => 14,
],
'slack' => [
'driver' => 'slack',
'url' => env('LOG_SLACK_WEBHOOK_URL'),
'username' => 'Laravel Log',
'emoji' => ':boom:',
'level' => 'error',
],
'payments' => [
'driver' => 'daily',
'path' => storage_path('logs/payments.log'),
'days' => 30,
],
],
];
ログローテーション
logrotate(Linux 標準)
# /etc/logrotate.d/app
/var/log/app.log {
daily
rotate 14
compress
delaycompress
missingok
notifempty
create 0640 www-data www-data
sharedscripts
postrotate
# PHP-FPM のログ再オープン
systemctl reload php8.3-fpm > /dev/null 2>&1 || true
endscript
}
Monolog の RotatingFileHandler
アプリ内でローテーション完結したい場合(コンテナ環境で便利):
// 日次ローテート、過去 14 日保持
$handler = new RotatingFileHandler('/var/log/app.log', 14);
// ファイル名は app-YYYY-MM-DD.log で自動生成
外部サービス連携
| サービス | 用途 | 連携方法 |
|---|---|---|
| Sentry | 例外/エラー追跡 | sentry/sentry-laravel / handler 追加 |
| Datadog | APM + ログ統合 | DD_LOGS_INJECTION=true + tail エージェント |
| CloudWatch Logs | AWS ログ集約 | FluentBit / CloudWatch Agent |
| Papertrail / Loggly | SaaS ログ管理 | syslog 転送 |
| Elasticsearch + Kibana | OSS ログ検索 | Filebeat → Elasticsearch |
// Sentry の例(Laravel)
// composer require sentry/sentry-laravel
// .env: SENTRY_LARAVEL_DSN=https://...@sentry.io/...
// config/logging.php に channel 追加
'sentry' => [
'driver' => 'sentry',
'level' => 'error',
],
// 利用は通常通り
Log::channel('sentry')->error('決済失敗', ['user' => $user->id]);
本番運用のチェックリスト
- ✅
display_errors=Off/log_errors=On(ユーザに stack trace を見せない) - ✅ ログファイルは Web から見えない場所 (
/var/log/等) に - ✅ logrotate or RotatingFileHandler で無制限肥大化を防ぐ
- ✅ 個人情報 / トークン / クレカ番号をログに残さない(マスキング)
- ✅ Sentry / Datadog でアラート設定(CRITICAL ≧ 即 Slack 通知)
- ✅ ログレベルを環境で切替(dev=debug, prod=info)
- ✅ 構造化ログ(JSON)で機械検索しやすく
FAQ
Q: echo や print_r でデバッグするのは?
A: 開発時はOK、本番では絶対NG。HTMLに出力される or fastcgi バッファ汚染。必ず error_log / Logger を経由。
Q: ログが大量で重い
A: ① ログレベルを上げる(prod=warning 以上)② 非同期出力(Monolog の BufferHandler + キュー)③ 外部サービスへ送信。
Q: スタックトレースをログに残したい
A: $logger->error('msg', ['exception' => $e]) で Monolog が自動展開。または $e->getTraceAsString()。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページ
子ページはありません
同階層のページ
- インストール方法
- 文法
- Composerのインストール
- 内部関数
- フレームワーク
- エラー一覧
- 改行出力
- printとechoの違い
- シングルクォートとダブルクォートの違い
- returnとyieldの違い
- var_dumpをログ出力
- CSV読み込み
- 待機・処理の遅延
- ログファイルにエラーを出力する方法
- エラーログ出力関数
- URLパラメータの配列化
- empty, is_null. issetの判定比較表
- httpステータスコードの付与
- バージョンの確認
- php.ini
- APIを呼び出す方法
- 外部ファイルを呼び出す方法
- カンマ区切りの文字列を配列に変換
- 配列からランダムに値を取り出す方法
- Webスクレイピング
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- IPv6とは|128bitアドレス・コロン16進表記/::省略・リンクローカル・SLAAC・デュアルスタック NEW 2026-06-22 12:34:44
- MAC アドレスフィルタリングの仕組みと限界 | ネットワーク入門 NEW 2026-06-22 12:19:10
- VPNとは|暗号トンネル・サイト間/リモートアクセス・IPsec/SSL-VPN/WireGuardを解説 NEW 2026-06-22 12:19:10
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/2 とは 多重化・HPACK・バイナリフレーム | ネットワーク入門 NEW 2026-06-22 12:17:25
- Web通信プロトコル入門 HTTP/2・HTTP/3・WebSocket・gRPC・WebRTC | ネットワーク入門 NEW 2026-06-22 12:17:25
- gRPC とは HTTP/2 + Protocol Buffers の高速 RPC | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/3 (QUIC) とは UDP ベースの低遅延 Web 通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- 証明書と認証局(CA)とは|X.509・信頼チェーン・DV/OV/EV・失効(CRL/OCSP)を解説 NEW 2026-06-22 12:17:24
- ファイアウォールとは|パケットフィルタ・ステートフル・DMZ・次世代FW(L4/L7)を解説 NEW 2026-06-22 12:17:24
- iptables/nftablesとは|テーブル・チェーン・ルール例・永続化をLinux視点で解説 NEW 2026-06-22 12:17:24
- HAProxy とは frontend/backend と設定例 | ネットワーク入門 NEW 2026-06-22 12:17:24
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?