Tengo Cloud Foundry y la aplicación php con mod-sec.
La aplicación recibe del navegador un json POST. La publicación contiene varias imágenes codificadas en base 64 y Apace cortó esto en algunas líneas:
2020-05-01T13:49:31.69+0200 [APP/PROC/WEB/0] OUT 11:49:31 httpd modsec body":["{\"image1\":\"data:image/png;base64, ... 2020-05-01T13:49:31.69+0200 [APP/PROC/WEB/0] OUT tTHNrVze+6IgS/ftH89uE2lw¿Hay alguna manera de concatenar estos registros?
Deseo tener:
2020-05-01T13:49:31.69+0200 [APP/PROC/WEB/0] OUT 11:49:31 httpd modsec body":["{\"image1\":\"data:image/png;base64, ... tTHNrVze+6IgS/ftH89uE2lw\"}No creo que esto sea un problema con Apache Web Server o mod_sec. Cloud Foundry leerá los registros de las aplicaciones que se ejecutan en él, registros que se escriben en STDOUT/STDERR. Esta es la forma en que debe iniciar sesión si tiene una aplicación ejecutándose en Cloud Foundry, y si está implementando una aplicación PHP en Cloud Foundry, así es como el paquete de compilación de PHP configurará PHP y el servidor web Apache para alojar su aplicación PHP.
No puede simplemente iniciar sesión en un archivo porque el sistema de archivos para su aplicación que se ejecuta en Cloud Foundry es efímero. Funcionará durante los momentos felices, pero cuando algo falle y su aplicación falle, no funcionará. El sistema de archivos, incluidos los registros que haya escrito en él, desaparecerá cuando la aplicación se bloquee y eso dificultará mucho la solución de problemas.
Con respecto al comportamiento que está viendo, el sistema de registro de Cloud Foundry tiene límites de tamaño para una entrada de registro de una sola línea. Si intenta escribir una entrada de registro de una sola línea que va más allá del límite, el sistema de registro dividirá automáticamente la línea y terminará con dos líneas de registro. Sospecho que eso es lo que está pasando aquí.
Busqué un poco pero no pude encontrar un valor máximo documentado para la longitud de una línea antes de que se divida. Lo mejor que pude encontrar fue esta discusión sobre la configuración que proporciona algo de historia al respecto . Sin embargo, no parece ofrecer una explicación clara de cómo se configuran las cosas.
Como no pude encontrar un valor documentado oficialmente, quería probar y validar la longitud. Para hacer esto, implementé una aplicación de prueba en Pivotal Web Services (ejecuta la última versión de OSS Cloud Foundry) y escribí algunas líneas de registro largas (si desea ver el código de prueba, hágamelo saber). El máximo que pude obtener antes de dividir la línea fue de 61441 bytes (repetí el a a en mi prueba, si tiene caracteres de varios bytes como丂, se dividirá antes). Esto coincidía con el comportamiento anterior mencionado en el enlace de discusión anterior. Es posible que su kilometraje varíe, según la versión de CF que esté utilizando y la forma en que esté configurada su plataforma.
Independientemente del valor exacto del límite, siempre habrá algún límite. Puede tratar de reconstituir sus entradas de registro, es decir, volver a unirlas después del hecho, o puede almacenar la información en otro lugar. Utilice un servicio como una base de datos o envíe las entradas de registro directamente a syslog.
Syslog es una buena opción, pero la compatibilidad integrada de HTTPD requiere que syslogd se ejecute localmente , que no está dentro de un contenedor de Cloud Foundry. Probablemente sea más fácil usar la función de registro canalizado y usar un programa externo para enviar los registros. Aquí hay un ejemplo de cómo hacerlo .
No te fíes de los logs que encuentres impresos en los terminales, a veces son bonitos porque tienen colores. Sin embargo, la mejor opción y la más completa es confiar en los archivos de registro, porque no deberían tener abreviaturas (con suerte).
En cuanto a Apache, hay dos tipos de archivos de registro del servidor Apache httpd :
Dependiendo del sistema operativo que esté utilizando, puede encontrar el archivo de registro en diferentes ubicaciones.
Para encontrar la ubicación exacta del archivo de registro de apache, puede usar el comando grep :
grep ErrorLog /usr/local/etc/apache22/httpd.conf grep ErrorLog /etc/apache2/apache2.conf grep ErrorLog /etc/httpd/conf/httpd.conf El resultado de ejemplo podría ser: ErrorLog "/var/log/httpd-error.log" .
Lo mismo para el registro de acceso:
grep CustomLog /usr/local/etc/apache22/httpd.conf grep CustomLog /etc/apache2/apache2.conf grep CustomLog /etc/httpd/conf/httpd.confOtra posible solución sería imprimir el objeto base-64 directamente en un archivo.
Una posibilidad sería mirar la directiva Apache ErrorLogFormat . Esto le permite simplificar la información en cada registro de Apache, por lo que podría crear un formato que le daría un ancho más corto (menos detallado), lo que podría ayudar en su pantalla.
No conozco ninguna forma de concatenar registros dentro de Apache. Simplemente está escuchando el comando PHP error_log , por lo que el código PHP podría agruparlo y solo llamar a error_log una vez.