¿El contenido de la respuesta debe ser una cadena o un objeto? (Arriba) Cambios en el formato del registro de lúmenes
?Si usas frecuentemente laravel y el framework Lumen, definitivamente encontrarás esta excepción: el contenido de la respuesta debe ser una cadena u objeto que implemente __toString(), "booleano" dado, es precisamente por esta excepción , Simplemente decidí escribir notas relevantes.
?Los proyectos de la empresa utilizan el marco lumen. La persona anterior a cargo todavía era muy seria y responsable, y también era muy competente en el marco lumen. A través de las capacidades de registro de servicios y inyección de dependencias del marco, se agrega una clase de manejo de excepciones para capturar y registrar información de error en un archivo de registro cuando ocurre cualquier excepción, mientras se devuelven datos json al front-end. Creo que la razón para hacer esto es porque la clase de manejo de excepciones predeterminada de lumen devolverá el estado 500 y renderizará la página, lo cual no es adecuado para proyectos con front-end y back-end separados al mismo tiempo, un código de estado de 500; Es más probable que se considere un bloqueo del servicio, lo que parece un nivel un poco bajo. Recientemente, cuando estaba refactorizando este proyecto, fue necesario cambiar el formato del registro.
Si lo ha usado, debe saber que el formato de registro de lumen es muy amigable, es un formato de mensaje + matriz, y el tiempo de registro se inyectará a través del formateador.
¿Por qué necesitamos modificarlo? Porque para los requisitos de operación y mantenimiento de la plataforma, cuando el archivo de registro accede a ELK, cada dato que debe informarse está en formato json. La modificación es relativamente simple. El formato de registro para el manejo de excepciones. La modificación es un poco más complicada, pero también se puede lograr mediante el siguiente proceso de grabación.
Modificación del formato de registro
En lumen5.5 y versiones anteriores, el archivo bootstrap/app.php habilita la configuración de carga de fachada $app->withFacades() y utiliza la clase de registro fachada (Clase de fachada) Iluminar\Soporte\Fachadas\. Los registros son fáciles de encontrar.
Puedes ver que el objeto utilizado para el registro es Psr\Log\LoggerInterface, pero obviamente es solo una interfaz. Profundizando un poco más, puede ver que lumen usa el contenedor IOC para registrar el servicio en el archivo de clase principal laravel\lumen\Application, vinculando el registro de alias del servicio con Psr\Log\LoggerInterface.
No entraré en detalles sobre la implementación del contenedor de servicios, que se puede encontrar aquí. En resumen, si usa la fachada de registro, el procesamiento final del registro es el objeto Logger devuelto en la función RegisterLogBindings, por lo que hay dos formas de anular el formato del registro:
En resumen, elija la segunda ¿Cómo implementarlo?
Paso 1: crear un servicio en el directorio /app/Providers
Como puede ver en el método de registro, primero defina el formato de registro $format string. esta cadena simula una cadena json. LineFormatter es la clase utilizada por lumen para formatear registros y $format es el formato utilizado para formatear.
Las llamadas que escriben en registros (como Log::info($mesage,$content)) generalmente requieren dos parámetros. Como se mencionó anteriormente, el alias del servicio de registro corresponde al servicio de registro Monolog/Logger y debe tener un controlador de registro, es decir, $monologHandler.
$monologHandler proporciona creación de archivos de registro, escritura de registros y otras funciones. El \Monolog\Handler\RotatingFileHandler utilizado en este método es un servicio proporcionado por lumen que genera archivos de registro diariamente para escribir e ingresar registros, y elimina registros de más de 30 días.
? Paso 2: Reescribir la clase LineFormatter
En un registro de lumen normal, cada línea se muestra como una cadena. Si se modifica el formato $, se comparará con la matriz Show. compatibilidad. Por lo tanto, debe convertir el valor de cada objeto json de $record['formatted'] al formato json y luego formatearlo con $format para convertirlo en un formato json completo. Así que copié el archivo MonoLog/Formatter/LineFormatter.php, lo reescribí y lo registré con el objeto $monologHandler.
En comparación con el archivo original, modifiqué el método de formato para asignar una matriz vacía a elementos adicionales, de contexto y otros elementos de la matriz de registro si están vacíos, y modifiqué el método stringify para que estos El valor del elemento se convierte al formato json.
? Paso 3: Registre el proveedor de servicios en bootstrap/app.php
Puede ver que los registros iniciados por el usuario, las excepciones generadas y las excepciones del sistema están todos en formato json. p>
Registro de excepciones del registro de errores
¿La prueba arrojó una excepción clave
? Después de cambiar el formato del registro, llegué a la etapa de prueba, escribí un http simulado. sistema, excepción de interrupción del tiempo de espera de conexión MySQL, etc. casos de prueba.
Existe un párrafo de este tipo en la visualización del resultado final anterior. De hecho, esta es la visualización del registro de modificaciones de la clase de manejo de errores.
El motivo de la modificación es cuando. Se probó la excepción pdo y de repente se descubrió más de una excepción. Creo que mucha gente ha visto esto:
El contenido de la respuesta debe ser una cadena o un objeto que implemente __toString(), se proporciona "booleano".
El significado de este error es muy claro , la respuesta solo puede ser una cadena. Esto es muy extraño. Obviamente se genera una excepción y el valor de retorno debe ser una matriz. ¿Por qué la clase de manejo de excepciones subyacente dice que es de tipo bool? Para obtener más información, consulte el siguiente artículo: ¿El contenido de la respuesta debe ser una cadena o un objeto? (En) el manejo de excepciones de lumen, lo explicaré