ホームページ  >  に質問  >  本文

mod php error_log から Apache Errorlog に書き込むためのログ行の制限

単純な Apache 2.4 mod_php を Web サーバーとしてセットアップしました。 php.ini の error_log ディレクティブは設定されていないため、デフォルト値の 0 が使用されます。動作はここ (https://www.php.net/manual/en/function.error-log.php) で説明されており、最終結果を要約すると、SAPI (mod_php) モジュールのログ ハンドラーに転送されていることがわかります。 。ログは処理のために Apache に転送され、次に、設定した ErrorLog ディレクティブに基づいてファイルにログが記録されます。

問題は、Apache エラー ログに示されているように、php 側のログ ステートメントが 8192 バイトを超える場合、正確に 8192 バイトの文字列に切り詰められることです。 8192 バイトの制限は少しわかりにくいため、strace をワーカー スレッドにアタッチしてシステム コールを確認すると、書き込み長が 8192 バイトの書き込み呼び出しが 1 回だけ行われることがわかりました。 PHPにはログ制限コントロール/ディレクティブがあることは知っていますが、それらはerror_logステートメントに影響を与えません。これも確認しました。付け加えておきますが、現在の php ログの長さ制限は 1024 (デフォルト) ですが、それでも Apache エラー ログには 8192 バイトが記録されます。

この動作を、パラメーター message_type が 3 であるファイルに error_log を送信する場合と比較すると、完全な文字列が 8192 バイトのチャンクに書き込まれていることがわかります。 これに関する strace ログを添付します:

リーリー

message_type が 0 の場合、唯一の違いは書き込み呼び出しが 1 つだけであることです。

誰かがこれについての説明と、この 8192 バイト制限を回避する方法を提供してもらえますか?

P粉814160988P粉814160988233日前345

全員に返信(1)返信します

  • P粉567281015

    P粉5672810152024-02-04 10:50:33

    すでに述べたように、二度確認してください

    リーリー

    https://www .php.net/manual/en/errorfunc.configuration.php#ini.log-errors-max-len

    マニュアルで述べたように、これはすべてバイト単位で行われるため、他のファイルを確認する必要があります。 https://www.php.net/manual/en/faq.using.php#faq.using.shorthandbytes

    nginx/php-fpm も調整する必要があります:

    https://forums.freebsd.org/threads/howto-stop-nginx-php-fpm-from-truncating-your-stack-trace-error-message.56543/

    /etc/php-fpm.conf で、log_limit = NumberInBytes の値を変更して、php-fpm を再起動できます。

    他のエラーを回避または確認するには、次のこともできます。 php.ini の error_log ディレクティブの設定を解除します。 nginxの標準エラーに記録するには その後、自分のエラー ログにログインします。

    設定も便利です php-fpm php-fpm.conf で catch_workers_output = yes を設定します こうすることで、標準エラーは破棄されません。

    返事
    0
  • キャンセル返事