我有一個簡單的 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 位元組限制嗎?
正如已經提到的,請檢查兩次
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 這樣標準誤差就不會被丟棄。