Maison  >  Questions et réponses  >  le corps du texte

Limite de ligne de journal écrite dans Apache Errorlog à partir du mod php error_log

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粉814160988P粉814160988282 Il y a quelques jours397

répondre à tous(1)je répondrai

  • P粉567281015

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

    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.

    répondre
    0
  • Annulerrépondre