WordPressのエラーやデバッグをログファイルや画面に出力する ~2022年検証済み

WordPressの使い方

WordPressのエラーやデバッグをログファイルや画面に出力する方法

この記事では「WordPressのエラーやデバッグの内容をログファイルや画面に出力する設定」について解説します。

設定は簡単!「選んでコピペ」するだけです。

他の記事を見てできなかったという方も2022年最新版で検証してありますのでぜひ読んでみてください。(ここ数年で仕様が変わった部分があります)

WordPressのエラーやデバッグのログ出力やアクセスログの出力について、こんな要望やお困りの方が読むと解決できます。

  • 管理者だけが画面でエラーメッセージを見れるようにしたい
  • エラーをファイルだけに出力したい
  • エラーを画面とファイルの両方に出力したい
  • エラーを画面にもファイルにも出力したくない
  • エラーの量を調節したい
  • 日付ごとにログファイルを作成したい
  • IPアドレスやURLなどのリクエストごとのアクセスログを出力したい
  • 自分で書いた文字列をログファイルに出力したい

時間がない!という人は最後の「おすすめ設定まとめ」のところだけでも大丈夫です。

この記事を監修・執筆した専門家

こんにちは!この記事を監修・執筆した斎藤はじめと申します。
私は現役のエンジニアで、普段はWordPressの開発案件などをメインに担当しています。経歴としては誰もが知っている月間数千万人が利用するサービスの開発をしたり、今でも月間数百万人が訪問する規模のWordPressサイトの運営しております。WordPressを触らない日はありません。

そんな私がプロの目で解説していきます!

設定を編集する前に

実際の設定を紹介する前にいくつか前提などを伝えておきます。

WordPressではログの設定はインストールしたディレクトリ直下にあるwp-config.phpファイルやテーマ直下のfunctions.phpを修正して設定します。

wp-config.phpでやることは2つ

  • ①設定の追記
  • ②初期設定の削除

②の設定は後勝ちの上書きなので、ファイルの末尾近くにあるデフォルトの設定はコメントアウトします。

またwp-config.phpの編集に便利なプラグインはこちら

エラー出力先の組み合わせ別に4パターンの設定方法

では実際の設定内容を紹介します。

エラーやデバッグの出力について、次の4パターンを紹介しますので、選んでコピペしてみてください。

  • ①ファイルに出力し、画面上は管理者だけに表示 【※おすすめ】
  • ②ファイルに出力し、全ユーザーの画面上にも表示させる
  • ③ファイルに出力し、画面上には一切表示させない
  • ④ファイルにも画面にも出力しない

①の設定の中で一番くわしい説明をしています。

①ファイルに出力し、画面上は管理者だけに表示 【※おすすめ】

ファイルには全エラーを出力し、画面上に管理者だけが見えるようにメッセージを表示します。
少し複雑になってしまいますが、本番で一番おすすめの方法です。これはサイト運営においていち早くバグやエラーに気づく上で重要です。

ポイントは以下

  • 管理者の時だけフラグを立ててエラーの画面表示/非表示の切替をする
  • 日付入りのログファイルを作成してエラーを出力

ログファイルも1ファイルに記録しているとあっというまに数GBのログファイルが出来てしまい処理効率が悪くなっていきますので分割することが重要です。

wp-config.phpを編集する

ログファイル出力先のだし分け設定を行います。/wp-content/wp-config.phpというファイルを編集します。

wp-config.phpの内容

<?php


~中略~


//↓↓↓①追記する内容 ----------------------------------

define("WP_DEBUG", true);                          //WordPressのデバッグ出力モードON

//=================================================
//PHPが出すエラーの量の設定
//(途中どこかで上書きされてしまうことが多いので確実に出したい場合は出力直前で設定すること)
//=================================================
//ini_set('error_reporting', E_ALL);                       //全て
ini_set('error_reporting', E_ALL & ~E_NOTICE); //NOTICEは除く


//=================================================
//セッションによる管理ユーザーと一般ユーザーの振り分け
//=================================================
if(session_status() !== PHP_SESSION_ACTIVE){ //セッションがアクティブじゃなければ
	session_start(); //セッションを開始
}

//管理ユーザー(セッションの中のデバッグ有効フラグが有効)
if(isset($_SESSION["_wp_debug"]) && $_SESSION["_wp_debug"] == 1){

	//================================
	//画面表示の設定
	//================================
	define("WP_DEBUG_DISPLAY", true);                  //デバッグメッセージをブラウザに表示/非表示
	ini_set("display_errors", 1);          //PHPの画面エラー出力のON/OFF
}
//一般ユーザー(セッションの中のデバッグフラグが有効ではない)
else{
	//================================
	//画面表示の設定
	//================================
	define("WP_DEBUG_DISPLAY", false);                  //デバッグメッセージをブラウザに表示/非表示
	ini_set("display_errors", 0);           //PHPの画面エラー出力のOFF
}


//=================================================
//ログファイルの設定
//=================================================
//ログフォルダがなければ作る
if(file_exists("wp-content/log") == false){
	mkdir("wp-content/log", 0770, true);
}
define("WP_DEBUG_LOG", "wp-content/log/wp-debug_" . date("Y-m-d") . ".log" ); //WordPressのエラー出力ファイルを指定
//define("WP_DEBUG_LOG", true);                    //※5.1未満はtrueのみ指定可。その場合はwp-content/debug.log固定


//↑↑↑①追記する内容 ----------------------------------





//define( 'WP_DEBUG', false ); //②もともとある設定はコメントアウトする



※最後のコメントアウトを忘れると「Notice: Constant WP_DEBUG already defined 」という注意メッセージが表示されます。

functions.phpを編集する

次に以下のソースもfunctions.phpに設置してください。管理者のときだけデバッグフラグを立てる部分です。
wp-config.php読み込みの段階ではまた呼び出せない関数を含むので別でテーマディレクトリ直下(/wp-content/themes/テーマ名)のfunctions.phpに設置する必要があります。

functions.phpの内容

<?php

//WordPressの処理で現在のユーザーがセットされたら実行
add_action('set_current_user', function (){

	if(current_user_can('administrator')){ //管理者ユーザーなら
		$_SESSION["_wp_debug"] = 1; //セッション内にデバッグ有効フラグを保存
	}else{
		$_SESSION["_wp_debug"] = 0; //セッション内にデバッグ無効フラグを保存
	}

});

functions.phpの編集方法

functions.phpはWordPressの機能追加をするためのPHPファイルです。

(※実ファイルは/wp-content/themes/<テーマ名>/の直下にあります)

functions.phpを修正する場合は必ず親テーマではなく子テーマのfunctons.phpを修正してください。

※その理由や親テーマと子テーマについてはこちら↓の記事を参考に。

管理画面からfunctions.phpを参照・編集するには以下のように「外観>テーマ(ファイル)エディター」にアクセスしてテキスト編集をします。

PHPファイルの記述ルールとしてプログラムコードは以下のようにphpタグの囲みの中にある必要があります。

<?php

	→PHPのプログラムを書く場所

?> ←最後PHPで終わる場合だけ省略可能

また、直接functions.phpを編集するよりもこちらのプラグインで編集した方が便利なので参考にしてみてください。

これらの設定を行った際の実際の画面を確認

今やってきたおすすめ設定、「ファイルに出力し、画面上は管理者だけに表示 」を画面上でどうなるか確認してみましょう。

コンパイルエラーなどの致命的なエラーの場合

PHPの文法を間違ったコンパイルエラーなどの致命的なエラーの場合は管理者側ではこのように表示されます。

一般ユーザーではこのように表示されます。
エラーの詳細は表示されないので、セキュリティ的には◎です。

その他の通常エラーや警告の場合

通常のエラーや警告などの場合は、管理者側ではこのように具体的なエラーメッセージが表示されます。

一方、一般ユーザーではこのように表示すらされません。

出力の違いのイメージがつきましたでしょうか。

確認用にわざとエラーを出す方法

ちょっとマニアックですが、テストでエラーを出したい場合は以下のように出してみてください。ショートコードの中で出してみます。

functions.phpに以下を追加。

<?php
//文字列を出力するだけのショートコードを登録
add_shortcode('shortcode_test', function($atts, $content, $tag ){

	trigger_error("E_USER_NOTICEのエラー!", E_USER_NOTICE);
	trigger_error("E_USER_WARNINGのエラー!",E_USER_WARNING);
	error_log("error_log");

	return null;
});

[shortcode_test]を記事上に埋め込み、管理者でログインしてからページを表示してみてください。画面上にこのようなエラーが表示されます。

管理者をログアウトしてから表示するとメッセージが消えているはずです。

また、/wp-content/logディレクトリにこのようなファイルが出来ています。

これでおすすめ設定である「①ファイルに出力し、画面上は管理者だけに表示 」は終了です。

②ファイルに出力し、全ユーザーの画面上にも表示させる

ファイルに出力し、全ユーザーの画面上にも表示させるパターンの設定です。

wp-config.phpの内容

<?php


~中略~


//↓↓↓①追記する内容 ----------------------------------

define("WP_DEBUG", true);                          //WordPressのデバッグ出力モードON

//================================
//画面表示の設定
//================================
define("WP_DEBUG_DISPLAY", true);                  //デバッグメッセージをブラウザに表示/非表示
ini_set("display_errors", 1);           //PHPの画面エラー出力のOFF

//================================
//ログファイルの設定
//================================
//ログフォルダがなければ作る
if(file_exists("wp-content/log") == false){
	mkdir("wp-content/log", 0770, true);
}
define("WP_DEBUG_LOG", "wp-content/log/wp-debug_" . date("Y-m-d") . ".log" ); //WordPressのエラー出力ファイルを指定
//define("WP_DEBUG_LOG", true);                    //※5.1未満はtrueのみ指定可。その場合はwp-content/debug.log固定


//↑↑↑①追記する内容 ----------------------------------


//define( 'WP_DEBUG', false ); //②もともとある設定はコメントアウトする

③ファイルに出力し、画面上には一切表示させない

ファイルに出力し、画面上には一切表示させないパターンの設定です。

wp-config.phpの内容

<?php


~中略~


//↓↓↓①追記する内容 ----------------------------------

define("WP_DEBUG", true);                          //WordPressのデバッグ出力モードON

//================================
//画面表示の設定
//================================
define("WP_DEBUG_DISPLAY", false);                  //デバッグメッセージをブラウザに表示/非表示
ini_set("display_errors", 0);           //PHPの画面エラー出力のOFF

//================================
//ログファイルの設定
//================================
//ログフォルダがなければ作る
if(file_exists("wp-content/log") == false){
	mkdir("wp-content/log", 0770, true);
}
define("WP_DEBUG_LOG", "wp-content/log/wp-debug_" . date("Y-m-d") . ".log" ); //WordPressのエラー出力ファイルを指定
//define("WP_DEBUG_LOG", true);                    //※5.1未満はtrueのみ指定可。その場合はwp-content/debug.log固定


//↑↑↑①追記する内容 ----------------------------------


//define( 'WP_DEBUG', false ); //②もともとある設定はコメントアウトする

④ファイルにも画面にも出力しない

ファイルにも画面にも出力しないパターンの設定です。

wp-config.phpの内容

<?php


~中略~


//↓↓↓①追記する内容 ----------------------------------

ini_set("display_errors", 0);           //PHPの画面エラー出力のOFF

//↑↑↑①追記する内容 ----------------------------------


define( 'WP_DEBUG', false ); //②もともとある設定はそのまま

補足

WP_DEBUG_LOGとWordPressバージョン

WP_DEBUG_LOGの第2引数にファイル名を指定できるのはWordPress5.1以降のバージョンの場合の記述になります。5.1というと2019年リリースですので結構古いので、ほとんどの方はこちらの新しい方法になると思います。

	define("WP_DEBUG_LOG", "wp-content/log/wp-debug_" . date("Y-m-d") . ".log" ); //WordPressのエラー出力ファイルを指定
	//define("WP_DEBUG_LOG", true);                    //※5.1未満はtrueのみ指定可。その場合はwp-content/debug.log固定

バージョンは管理画面の一番下のフッタに書いてあるので確認してみてください。

出すエラーの量の調整

エラーを出す量を調節するにはerror_reportingの値を変えてみてください。

ini_set('error_reporting', E_ALL); //最大限出す
ini_set('error_reporting', E_ALL & ~E_NOTICE); //注意レベルは除く
ini_set('error_reporting', 0); //何も出さない

※ただこのerror_reporting設定はWordPress内のあちこちで都度書き換えられることが多いため、確実に機能せさたいならば出力直前で設定する必要があります。

自分でデバッグやエラーをファイル出力する関数error_log

設定したログファイルに自分のコードなどから明示的に出力するには以下のような関数を使います。

error_log("出力するテキスト");
ログファイル

[10-Oct-2021 17:00:35 UTC] 出力するテキスト
[10-Oct-2021 17:00:43 UTC] 出力するテキスト

あれ、、時刻が世界標準のUTCになってますね。

ログファイルの時刻のタイムゾーンを変更

ログファイルの時刻のタイムゾーンを変更するにはインストールディレクトリ直下のwp-setting.phpの内容を修正します。

世界標準のUTC⇒日本時間Asia/Tokyoに変更します。

※WordPress5.1より前はJSTでもよかったのですが5.1以降はAsia/Tokyoとしてください。

wp-setting.phpの内容

<?php


~中略~

//date_default_timezone_set( 'UTC' );              ←コメントアウト
date_default_timezone_set( 'Asia/Tokyo' );                  ←追加

~中略~

WordPressのアクセスログを出力する

WordPressでアクセスログを出すのは非常にお勧めです。

1アクセスに1行の基本的なアクセスログを出力してみましょう。
出力する項目はURL、IPアドレス、ユーザーエージェント、WordPressのログインIDです。

WordPressにはデフォルトでアクセスログを見る手段はありません。
実際にサーバー上でログを出してみると、普段Googleアナリティクスのデータだけ見ていては気づかない不正なアクセスに気づきます。

勉強にもなり、セキュリティの意識も変わると思います。また、ビジネス上の詳細なデータ調査の際も役に立つのでアクセスログはあったほうが何かと便利です。

functions.phpに以下を追記します。

    add_action('set_current_user', function (){

        //アクセスログの出力
        $uri = isset($_SERVER["REQUEST_URI"]) ? $_SERVER["REQUEST_URI"] : null; //リクエストURI(URLのドメイン以降全て)
        $ip = isset($_SERVER["REMOTE_ADDR"]) ? $_SERVER["REMOTE_ADDR"] : null; //ユーザーのIPアドレス
        $user_agent = isset($_SERVER["HTTP_USER_AGENT"]) ? $_SERVER["HTTP_USER_AGENT"] : null; //ユーザーエージェント
        $user = wp_get_current_user();
        $login_id = $user->user_login; //WordPressのログインID
        error_log("#log_type=access #ip={$ip} #uri={$uri} #login={$login_id} #user_agent=\"{$user_agent}\""); //実際に出力

    });

すると先ほど設定したログファイルに以下のようなログが出力されます。

もし怪しいアクセスなどがあれば、All In One WP Security & FirewallというプラグインでIPごとブロックしてしまいましょう。

このように定期的に生ログを見てみることは非常に重要だったりします。
その上で徐々に自動化などしていくのがセキュリティの運用上良い方法です。

おすすめの設定まとめ

ちょっといろいろ書いてしまったので、ごちゃごちゃ読みにくくなってしまったかもしれません。
今一度おすすめの設定方法をまとめてみます。

これさえやっておけばだいたい間違いないです。

  • ①ログの基本設定
  • ②管理者フラグの切り替え
  • ③アクセスログの設定
  • ④タイムゾーンの設定

①ログの基本設定

wp-config.phpに
・全エラーログファイル出力&管理者のみ画面にも表示
・日付ごとのログファイル出力
という設定をします。

wp-config.phpの内容

<?php


~中略~


//↓↓↓①追記する内容 ----------------------------------

define("WP_DEBUG", true);                          //WordPressのデバッグ出力モードON

//=================================================
//PHPが出すエラーの量の設定
//(途中どこかで上書きされてしまうことが多いので確実に出したい場合は出力直前で設定すること)
//=================================================
//ini_set('error_reporting', E_ALL);                       //全て
ini_set('error_reporting', E_ALL & ~E_NOTICE); //NOTICEは除く


//=================================================
//セッションによる管理ユーザーと一般ユーザーの振り分け
//=================================================
if(session_status() !== PHP_SESSION_ACTIVE){ //セッションがアクティブじゃなければ
	session_start(); //セッションを開始
}

//管理ユーザー(セッションの中のデバッグ有効フラグが有効)
if(isset($_SESSION["_wp_debug"]) && $_SESSION["_wp_debug"] == 1){

	//================================
	//画面表示の設定
	//================================
	define("WP_DEBUG_DISPLAY", true);                  //デバッグメッセージをブラウザに表示/非表示
	ini_set("display_errors", 1);          //PHPの画面エラー出力のON/OFF
}
//一般ユーザー(セッションの中のデバッグフラグが有効ではない)
else{
	//================================
	//画面表示の設定
	//================================
	define("WP_DEBUG_DISPLAY", false);                  //デバッグメッセージをブラウザに表示/非表示
	ini_set("display_errors", 0);           //PHPの画面エラー出力のOFF
}


//=================================================
//ログファイルの設定
//=================================================
//ログフォルダがなければ作る
if(file_exists("wp-content/log") == false){
	mkdir("wp-content/log", 0770, true);
}
define("WP_DEBUG_LOG", "wp-content/log/wp-debug_" . date("Y-m-d") . ".log" ); //WordPressのエラー出力ファイルを指定
//define("WP_DEBUG_LOG", true);                    //※5.1未満はtrueのみ指定可。その場合はwp-content/debug.log固定


//↑↑↑①追記する内容 ----------------------------------





//define( 'WP_DEBUG', false ); //②もともとある設定はコメントアウトする



②管理者フラグの切り替え

管理者のみ画面出力のために、管理者フラグの切り替えをします。
WordPressのシステムの都合上、こちらはfunctions.phpに記述します。

functions.phpの内容

<?php

//WordPressの処理で現在のユーザーがセットされたら実行
add_action('set_current_user', function (){

	if(current_user_can('administrator')){ //管理者ユーザーなら
		$_SESSION["_wp_debug"] = 1; //セッション内にデバッグ有効フラグを保存
	}else{
		$_SESSION["_wp_debug"] = 0; //セッション内にデバッグ無効フラグを保存
	}

});

③アクセスログの設定

アクセスログを出力します。これもfunctions.phpを編集します。

出力する項目はURL、IPアドレス、ユーザーエージェント、WordPressのログインIDです。

    add_action('set_current_user', function (){

        //アクセスログの出力
        $uri = isset($_SERVER["REQUEST_URI"]) ? $_SERVER["REQUEST_URI"] : null; //リクエストURI(URLのドメイン以降全て)
        $ip = isset($_SERVER["REMOTE_ADDR"]) ? $_SERVER["REMOTE_ADDR"] : null; //ユーザーのIPアドレス
        $user_agent = isset($_SERVER["HTTP_USER_AGENT"]) ? $_SERVER["HTTP_USER_AGENT"] : null; //ユーザーエージェント
        $user = wp_get_current_user();
        $login_id = $user->user_login; //WordPressのログインID
        error_log("#log_type=access #ip={$ip} #uri={$uri} #login={$login_id} #user_agent=\"{$user_agent}\""); //実際に出力

    });

④タイムゾーンの設定

ログファイル上でのタイムゾーンを日本に設定します。

wp-settinng.phpというファイルを編集し、WordPressのデフォルトタイムゾーンを設定。

wp-setting.phpの内容

<?php


~中略~

//date_default_timezone_set( 'UTC' );              ←コメントアウト
date_default_timezone_set( 'Asia/Tokyo' );                  ←追加

~中略~

以上で終了です。おつかれさまでした。

ログレベルなどの細かい設定はありませんが、大分便利になりました。

最後までお読みいただきありがとうございました!

コメント

タイトルとURLをコピーしました