画面に表示させずにデバッグ情報(エラーや警告の情報)を取得する方法

公開日:2023(令和5)年12月18日/最終更新日:

, ,
WordPress Customize Ideas | Personal WP Customization Notes (PWCN)

【景品表示法に基づく表記】ページ内のコンテンツには、商品プロモーションが含まれています



WordPressのサイトで、画面上部に何かの警告?と思える謎の英語が表示されて、何?って思うことありますよね?

これはデバッグ情報と言って、サイトを動かすプログラムの何かに不都合や不具合が発見されたときに、警告(Warning)や注意(Notice)などを表示させるためのもので、サーバー内の階層などが丸裸になってしまうため、そもそもこれが表示される設定自体が問題です。

意図して表示させるようにしているのでないなら、以下のページを参考に表示されないようにしましょう。

逆に、これらの情報を知りたいけど画面には出したくない、いつ発生しているのかを知りたい(デバッグのログを取りたい)というケースがあると思います。

そこで本ページでは、画面上にはデバッグ情報を表示させないようにしつつ、デバッグのログ(警告や注意の発生した場合の時系列の情報)をファイルに出力する簡単な方法を紹介します。

この方法は、WordPressの重要なファイルである「wp-config.php」へコードを追加します。慣れていない方や万が一トラブルとなった場合に対処できない方は、やめておいた方が無難です

WordPressのデバッグログをファイルへ出力する方法

wp-config.phpを開く(どこにあるのか等はわかっている前提ですので割愛します)と、以下の記述があります。

define('WP_DEBUG', false);

これを一旦削除して、同じ場所へ以下のコードを追加します。

define('WP_DEBUG', true); //デバッグモードを有効にする
if ( WP_DEBUG ) {
    // debug.log ファイルに記録
    define( 'WP_DEBUG_LOG', true );
    // ブラウザ上に表示しない
    define( 'WP_DEBUG_DISPLAY', false );
    // ブラウザ上に表示しない
    @ini_set( 'display_errors',0 );
}

このコードではこんな感じで処理が行われます。

  1. define(‘WP_DEBUG’, true); でデバッグを有効にする
  2. WP_DEBUGでデバッグが有効になっていたら
    • ファイルに記録する
    • ブラウザ上にエラーを含めて表示しない

これでデバッグ情報があればwp-contentの中の「debug.log」というファイル内へ、発生した日時と内容がどんどん追加で出力されます。

発生日時については、UTCで出力されるので、日本だとその時刻の9時間後(日本はUTC+9なので)に実際に発生したということになります

基本的にNoticeは注意情報なので特に気にすることはなく、Warningについては内容によっては緊急性のあるものの場合があるので、内容をググるなりして対処しましょう。

ただし、NoticeもWarningも今現在の動作に直ちに影響があるわけではない(そもそもエラーだったら動作しない)ですし、基本的にカスタマイズはプラグインに頼っていて、自身でコードの追加等を行っていない場合には、WordPress本体やテーマ、プラグイン内のコードと、サイトが収容されているサーバー環境間の問題ですから、それらが更新されるのを待つのが無難でしょう。

サイトヘルスにメッセージが出るのは?

なお、この方法を使うと、管理画面のサイトヘルスで「このサイトの設定は、潜在的に誰もが参照可能なファイルにエラーを書き出します」というメッセージが表示されるようになります。

サイトヘルスでの致命的な問題を示すメッセージ

タイトルをクリックすると以下のようなことが書かれています。

デバッグモードを有効化するとエラーやサイトの失敗の詳細情報を収集できます。しかし誰もがアクセス可能な Web サイトに置くべきでない、重要な情報を含む場合があります。

値 WP_DEBUG_LOG がこのサイトの構成ファイルに追加されました。これは、サイトで発生したエラーが潜在的にすべてのユーザーが参照可能なファイルに書き出されることを意味します。

これは、本ページの措置をしたことで、デバッグモードを有効にしていることと、エラーログを書き出していることに対して注意をされているもので、分かって措置しているのですから無視して大丈夫です。

ただ、例えば将棋は駒を動かす前の状態が一番強いのと同じで、今回の場合のように何かをファイルに書き出す処理をさせることで、少なからずサイトのセキュリティを低下させる可能性があるかも知れませんので、必要なければ本ページの措置(コード)はコメントアウトするか削除するようにしておくことをおすすめします。

別の場所へエラーログを書き出す方法

いろいろなページを見ていて間違っていることが多かったのでついでにお知らせしておきます。

多くの情報では、以下のように書くことで、任意の場所へエラーログが出力されるとされています。

define('WP_DEBUG', true);
define( 'WP_DEBUG_LOG', 'ログを出力するディレクトリとファイル' );

このうち、WP_DEBUGをtrueにすることは正解です。そして、WP_DEBUG_LOGの後ろをtrueではなく「ログを出力するディレクトリとファイル」にすると出力されるというところもあっています。

が、この「ログを出力するディレクトリとファイル」は、絶対パスでないといけません。

絶対パスとは、サーバー内の正確な階層でファイルまでを示したもので、よく書かれている「wp-contentからの相対パスではありません」のでご注意ください。

例えば、私が使用しているカラフルボックス ColorfulBoxで、wp-contentの中にある「任意のフォルダ」という名前のフォルダの中に、「error-log.log」というログファイルのファイル名と拡張子で出力する場合には、以下のように指定します。

define('WP_DEBUG', true);
define( 'WP_DEBUG_LOG', '/home/ユーザー名/public_html/サイトのフォルダ/wp-content/任意のフォルダ名/error-log.log' );

この絶対パス(フルパス)が分からない場合は、既に出力されているエラーログに書かれている内容で、それらしい記述がある(例えば〇〇プラグインの〇〇ってファイルだよと書かれている前など)ので、ご自身で調べてください。

これを踏まえ、前項で紹介した、画面出力はしないでエラーログを取りたい場合には、以下のようにします。

define('WP_DEBUG', true); //デバッグモードを有効にする
if ( WP_DEBUG ) {
    // ファイルに記録
    define( 'WP_DEBUG_LOG', '/home/ユーザー名/public_html/サイトのフォルダ/wp-content/任意のフォルダ名/error-log.log' );
    // ブラウザ上に表示しない
    define( 'WP_DEBUG_DISPLAY', false );
    // ブラウザ上に表示しない
    @ini_set( 'display_errors',0 );
}

ちなみにうまくいかなくて、AIに聞いてみたら、以下のようなコードが返ってきました。

define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_LOG_PATH', '/path/to/log/file/debug.log' );

..え?WP_DEBUG_LOG_PATHなんて定数ないんですけどって聞き返したら、誤りがあったと言いつつ何度も同じコード返してきて、ちょっと困りました...。

そうこうしているうちにいろいろと調べたら、ああ、絶対パスしかダメなのねというところに行きついて、自己解決しました。

一応そのことをAIに伝えたら以下のような回答が返ってきました。

はい、おっしゃる通りです。WP_DEBUG_LOGで指定するパスはフルパス(絶対パス)である必要があります。絶対パスは、ファイルまたはディレクトリの完全なパスであり、ルートディレクトリから始まります。

例えば、/var/www/html/wp-content/debug.logのような形式の絶対パスを指定する必要があります。これは、サーバーのファイルシステム上での具体的な場所を示しています。

相対パス(現在の作業ディレクトリからの相対的なパス)を指定すると、期待した場所にログファイルが作成されない可能性があります。したがって、フルパスを使用することをお勧めします。

ご不明な点があれば、遠慮なくお聞きください。

これで同じ質問をした人に正しい回答がされるようになるといいのにと願いつつ...。

ログフォルダへのアクセス拒否はしておくといい

ここまでwp-content内にフォルダを作ってその中にエラーログを書き出す方法を紹介してきましたが、階層さえわかればこのファイルはどこからでも見えてしまいます。

まあ、わざわざ探して見に来る人は少ないとは思いますが、エラーログを見れば構造などが分かってしまうことがあり、セキュリティ的に不都合が生じることがありますので、以下のようなコードを書いた「.htaccess」ファイルをフォルダ内に置いておくと回避できます。

# AccessControl IP/HOST
order deny,allow
Deny from all
Allow from 許可するグローバルIPアドレス
Allow from 収容しているサーバーのIPアドレス

「許可するグローバルIPアドレス」はログを見る拠点のIPアドレス、「収容しているサーバーのIPアドレス」はサイトの収容されているサーバーのグローバルIPアドレスを指定します

WordPressの更新ログを出力させないようにするには(考察)

ログをファイルに出力すると、WordPressの自動更新の開始と終了を示す「Automatic updates starting…」「Automatic updates complete.」というメッセージがログファイル内にどんどん追加されていきます。

エラーや警告ではないのに出力されるのはエラー判別しにくいという方は、以下のコードを有効化しているテーマのfunctions.phpへ追記することで出力されなくなると思います。

思いますと書いたのは、現在テスト的に追加しているコードで、確実に出力されなくなるか、その他は確実に出力されるかが不明なためです。追加した際には十分にテストを行うようにしてください。

/* WordPressの更新メッセージがエラーとして出力されないようにする */
function pwcn_ignore_update_log_message( $message ){
	// 特定のメッセージを無視
	if (strpos($message, 'Automatic updates starting...') !== false) {
		return false; // ログに記録しない
	}

	if (strpos($message, 'Automatic updates complete.') !== false) {
		return false; // ログに記録しない
	}

	return true; // それ以外は記録する
}
add_filter('log_errors','pwcn_ignore_update_log_message');
, , , ,



Lolipop ServerMoshimo Ad x-serverMoshimo Ad

WordPress Customize Ideas | Personal WP Customization Notes (PWCN)
プラグインの翻訳ファイルを確実に適用させるベストな方法(メモ)