Rumah  >  Soal Jawab  >  teks badan

Had baris log yang ditulis kepada Apache Errorlog daripada mod php error_log

Saya mempunyai persediaan apache 2.4 + mod_php yang mudah sebagai pelayan web. Arahan error_log dalam php.ini tidak ditetapkan, jadi ia mengambil nilai lalai 0. Tingkah laku diterangkan di sini (https://www.php.net/manual/en/function.error-log.php) dan untuk meringkaskan hasil akhir, saya melihat bahawa ia dimajukan kepada pengendali Log modul SAPI (mod_php) . Log dimajukan ke Apache untuk diproses, yang seterusnya mencatatkannya ke fail berdasarkan arahan ErrorLog yang saya tetapkan.

Masalahnya sekarang ialah apabila penyataan log di sebelah php panjang melebihi 8192 bait, ia dipenggal kepada rentetan tepat 8192 bait seperti yang ditunjukkan dalam log ralat Apache. Had 8192 bait agak mengelirukan, jadi apabila melampirkan strace pada benang pekerja dan melihat panggilan sistem, saya mendapati ia hanya melakukan satu panggilan tulis dengan 8192 bait sebagai panjang untuk menulis. Saya tahu php mempunyai kawalan/arahan had log tetapi ia tidak mempunyai sebarang kesan pada pernyataan error_log, saya juga mengesahkan ini. Hanya untuk menambah, had panjang log php semasa saya ialah 1024 (lalai) tetapi ia masih mencatatkan 8192 bait dalam log ralat apache.

Membandingkan tingkah laku ini dengan menghantar error_log ke fail dengan parameter message_type 3, saya dapat melihat bahawa rentetan lengkap ditulis dalam ketulan 8192 bait. Log strace dilampirkan untuk ini:

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

Jika message_type ialah 0, satu-satunya perbezaan ialah hanya terdapat satu panggilan tulis.

Bolehkah seseorang memberikan sedikit penjelasan tentang perkara ini dan cara mengatasi had 8192 bait ini?

P粉814160988P粉814160988233 hari yang lalu344

membalas semua(1)saya akan balas

  • P粉567281015

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

    Seperti yang telah disebutkan, semak dua kali

    log_errors_max_len should be 0.

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

    Seperti yang dinyatakan dalam manual, ini semua berlaku dalam bait, jadi kami perlu menyemak fail lain. https://www.php.net/manual/ en/faq.using.php#faq.using.shorthandbytes

    nginx/php-fpm juga perlu dilaraskan:

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

    Dalam /etc/php-fpm.conf anda boleh menukar nilai log_limit = NumberInBytes dan kemudian mulakan semula php-fpm

    Untuk mengelakkan atau menyemak ralat lain, anda juga boleh Nyahset arahan error_log dalam php.ini untuk log masuk ke ralat standard nginx kemudian akan log masuk ke log ralatnya sendiri.

    Tetapan juga berguna php-fpm configure catch_workers_output = ya dalam php-fpm.conf Dengan cara ini ralat standard tidak dibuang.

    balas
    0
  • Batalbalas