從 mod php error_log 寫入 Apache Errorlog 的日誌行限制
P粉814160988
P粉814160988 2024-02-03 17:43:09
0
1
402

我有一個簡單的 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 指令記錄在一個檔案中。

現在的問題是,當 php 端的日誌語句長度超過 8192 位元組時,它們會被截斷為正好 8192 位元組的字串,如 Apache 錯誤日誌中所示。 8192 位元組的限制有點令人費解,因此在將 strace 附加到工作線程並查看系統調用時,我發現它只執行一次寫入調用,並以 8192 位元組作為要寫入的長度。我知道 php 有日誌限制控制/指令,但它們對 error_log 語句沒有任何影響,我也驗證了這一點。只是補充一下,我當前的 php 日誌長度限制是 1024(預設),但它仍然在 apache 錯誤日誌中記錄 8192 位元組。

將此行為與使用參數 message_type 為 3 將 error_log 發送到檔案進行比較,我可以看到完整的字串以 8192 位元組的區塊形式寫入。 附上為此的 strace 日誌:

fstat(64, {st_mode=S_IFREG|0777, st_size=25009583, ...}) = 0
lseek(64, 0, SEEK_CUR)                  = 0
lseek(64, 0, SEEK_CUR)                  = 0
write(64, "<text to be logged>"..., 8192) = 8192
write(64, "<continued text ...>"..., 8192) = 8192
write(64, "<continued text ...>"..., 8192) = 8192

如果 message_type 為 0,唯一的差異是只有一次寫入呼叫。

有人可以對此提供一些解釋以及如何繞過這個 8192 位元組限制嗎?

P粉814160988
P粉814160988

全部回覆(1)
P粉567281015

正如已經提到的,請檢查兩次

log_errors_max_len should be 0.

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 這樣標準誤差就不會被丟棄。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!