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のデバッグ技術

お気軽にご相談ください

お見積りへ お問い合わせへ
▲