2026年9月21日
2026年9月21日
WordPressのログファイル管理方法【debug.log肥大化防止・ログローテーション】
はじめに
WordPressのWP_DEBUG_LOGを有効にするとwp-content/debug.logにエラーが記録されます。しかし適切に管理しないとログファイルが数GBに膨れ上がり、サーバーのディスクを圧迫します。適切なログ管理でデバッグを効率化しましょう。
症状・原因
wp-content/debug.logが数GB以上になりサーバーのディスクを圧迫している- 大量のNoticeやWarningで重要なエラーを見逃している
- ログに機密情報(パスワード・トークン)が含まれている
- ログファイルが公開URLからアクセスできてしまう(セキュリティリスク)
解決手順
ステップ1:ログ設定を最適化する
// wp-config.php: 本番環境向けログ設定
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', '/var/log/wordpress/debug.log'); // webroot外に保存
define('WP_DEBUG_DISPLAY', false); // 画面には表示しない
define('SCRIPT_DEBUG', false);
// php.ini または .htaccess でもログパスを設定
// error_log = /var/log/wordpress/debug.log
// log_errors = On
// display_errors = Off
# ログディレクトリをwebroot外に作成
sudo mkdir -p /var/log/wordpress
sudo chown www-data:www-data /var/log/wordpress
sudo chmod 755 /var/log/wordpress
# Nginxの設定にWordPressエラーログを追加
# /etc/nginx/sites-available/example.com
# error_log /var/log/nginx/wordpress-error.log warn;
ステップ2:カスタムログクラスを実装する
// カスタムロガークラス
class WP_Logger {
private static string $log_file;
private static array $levels = ['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'];
public static function init(): void {
self::$log_file = WP_CONTENT_DIR . '/logs/app-' . date('Y-m') . '.log';
wp_mkdir_p(dirname(self::$log_file));
}
public static function log(string $level, string $message, array $context = []): void {
if (!in_array($level, self::$levels, true)) return;
$entry = sprintf(
"[%s] [%s] %s %s\n",
date('Y-m-d H:i:s'),
strtoupper($level),
$message,
$context ? json_encode($context, JSON_UNESCAPED_UNICODE) : ''
);
// ファイルサイズチェック(10MB超えたらローテーション)
if (file_exists(self::$log_file) && filesize(self::$log_file) > 10 * 1024 * 1024) {
rename(self::$log_file, self::$log_file . '.' . time() . '.bak');
}
error_log($entry, 3, self::$log_file);
}
// 便利メソッド
public static function info(string $msg, array $ctx = []): void { self::log('INFO', $msg, $ctx); }
public static function error(string $msg, array $ctx = []): void { self::log('ERROR', $msg, $ctx); }
public static function debug(string $msg, array $ctx = []): void { self::log('DEBUG', $msg, $ctx); }
}
add_action('init', ['WP_Logger', 'init']);
ステップ3:ログローテーションをlogrotateで設定する
# /etc/logrotate.d/wordpress を作成
sudo tee /etc/logrotate.d/wordpress << 'EOF'
/var/log/wordpress/*.log {
daily # 毎日ローテーション
missingok # ファイルが無くてもエラーにしない
rotate 14 # 14日分保持
compress # gzipで圧縮
delaycompress # 1世代は非圧縮で保持
notifempty # 空ファイルはローテーションしない
create 0640 www-data adm # 新ファイルのパーミッション
sharedscripts
postrotate
# PHPをリロードしてファイルハンドルをリセット
if [ -f /var/run/php/php8.2-fpm.pid ]; then
kill -USR1 $(cat /var/run/php/php8.2-fpm.pid)
fi
endscript
}
EOF
# 動作確認(--debug でドライラン)
sudo logrotate --debug /etc/logrotate.d/wordpress
# 即座に実行
sudo logrotate --force /etc/logrotate.d/wordpress
ステップ4:ログファイルをWebからアクセス不可にする
# Apache: .htaccess でdebug.logへのアクセスを禁止
<Files "debug.log">
Order Allow,Deny
Deny from all
</Files>
# ログディレクトリ全体を禁止
<DirectoryMatch "wp-content/logs">
Require all denied
</DirectoryMatch>
# Nginx: debug.logへのアクセスをブロック
location ~* /wp-content/.*\.log$ {
deny all;
return 404;
}
ステップ5:ログを定期的に監視・アラートを送る
// 重大エラーが発生したらメール通知
add_action('shutdown', function(): void {
$error = error_get_last();
if (!$error) return;
if (!in_array($error['type'], [E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR])) return;
$message = sprintf(
"WordPress Fatal Error on %s\n\nType: %s\nMessage: %s\nFile: %s\nLine: %d\n\nTime: %s",
get_site_url(),
$error['type'],
$error['message'],
$error['file'],
$error['line'],
date('Y-m-d H:i:s')
);
wp_mail(
get_option('admin_email'),
'[WordPress] Fatal Error: ' . get_bloginfo('name'),
$message
);
});
// ログサイズ監視
add_action('wp_scheduled_log_check', function(): void {
$log_file = WP_CONTENT_DIR . '/logs/app-' . date('Y-m') . '.log';
if (!file_exists($log_file)) return;
$size_mb = filesize($log_file) / 1024 / 1024;
if ($size_mb > 50) { // 50MB超えたら警告
wp_mail(
get_option('admin_email'),
'[警告] ログファイルが大きくなっています',
"ログファイルが {$size_mb}MB を超えています: {$log_file}"
);
}
});
注意事項
- webroot外に保存:
wp-content/debug.logはデフォルトでWeb公開されます。必ずwebroot外のパス(例:/var/log/wordpress/)に変更してください - 機密情報のマスク: ログにパスワード・APIキー・個人情報が含まれないよう出力前にサニタイズしてください
- 本番環境: 本番環境では
WP_DEBUG_DISPLAY=falseを必ず設定し、エラーを画面に表示しないようにしてください
まとめ
ログ管理の要点は「webroot外に保存・ログローテーション・Webアクセス禁止・重大エラーのメール通知」の4つです。これらを設定することでデバッグ効率を上げながらサーバーリソースを守ることができます。関連記事:WordPressのデバッグ技術