Limite de ligne de journal écrite dans Apache Errorlog à partir du mod php error_log
P粉814160988
P粉814160988 2024-02-03 17:43:09
0
1
357

J'ai une simple configuration Apache 2.4 + mod_php comme serveur Web. La directive error_log dans php.ini n'est pas définie, elle prend donc la valeur par défaut de 0. Le comportement est décrit ici (https://www.php.net/manual/en/function.error-log.php) et pour résumer le résultat final, je vois qu'il est transmis au module SAPI (mod_php) Log handler . Les journaux sont transmis à Apache pour traitement, qui à son tour les enregistre dans un fichier basé sur la directive ErrorLog que j'ai définie.

Le problème est maintenant que lorsque les instructions de journal côté PHP dépassent 8 192 octets, elles sont tronquées en une chaîne d'exactement 8 192 octets, comme indiqué dans le journal des erreurs Apache. La limite de 8 192 octets est un peu déroutante, donc en attachant une strace au thread de travail et en regardant les appels système, j'ai constaté qu'il n'effectuait qu'un seul appel d'écriture avec 8 192 octets comme longueur d'écriture. Je sais que php a des contrôles/directives de limite de journalisation mais ils n'ont aucun effet sur l'instruction error_log, je l'ai également vérifié. Juste pour ajouter, ma limite actuelle de longueur de journal php est de 1024 (par défaut), mais elle enregistre toujours 8192 octets dans le journal des erreurs Apache.

En comparant ce comportement à l'envoi du error_log à un fichier avec le paramètre message_type de 3, je peux voir que la chaîne complète est écrite en morceaux de 8 192 octets. Journal de trace ci-joint pour cela :

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

Si message_type est 0, la seule différence est qu'il n'y a qu'un seul appel d'écriture.

Quelqu'un peut-il fournir des explications à ce sujet et comment contourner cette limite de 8 192 octets ?

P粉814160988
P粉814160988

répondre à tous(1)
P粉567281015

Comme déjà mentionné, vérifiez deux fois

log_errors_max_len should be 0.

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

Comme mentionné dans le manuel, tout cela se passe en octets, nous devons donc vérifier d'autres fichiers. https://www.php.net/manual/ en/faq.using.php#faq.using.shorthandbytes

nginx/php-fpm doit également être ajusté :

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

Dans /etc/php-fpm.conf vous pouvez modifier la valeur de log_limit = NumberInBytes puis redémarrer php-fpm

Pour éviter ou vérifier d'autres erreurs, vous pouvez également Désactivez la directive error_log dans php.ini pour le connecter à l'erreur standard de nginx se connectera ensuite à son propre journal d’erreurs.

Les paramètres sont également utiles php-fpm configure catch_workers_output = oui dans php-fpm.conf De cette façon, l’erreur standard n’est pas écartée.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!