Registro nativo en PHP 7

PHP tiene una función incorporada error_log() que envía un mensaje de error a las rutinas definidas de manejo de errores; por lo tanto, proporciona una solución lista para usar en un registro simple.
El siguiente fragmento de código describe la definición de la función error_log():

bool error_log (
string $message
[, int $message_type = 0
[, string $destination
[, string $extra_headers ] ]]
)

Los parámetros se definen de la siguiente manera:

  • $message: este es un valor de tipo de cadena y un mensaje que queremos registrar
  • $message_type: este es un valor de tipo entero; tiene uno de los cuatro valores posibles, que son los siguientes:
    0: este es un mecanismo de registro del sistema operativo
    1: se envía por correo electrónico a la dirección en el parámetro de destino
    2: esto ya no es una opción
    3: este mensaje se agrega al destino del archivo
    4: Esto se envía directamente al controlador de registro de SAPI
  • $destination: este valor de tipo de cadena se activa solo por $message_type = 1 y denota una dirección de correo electrónico
  • $extra_headers: este valor de tipo de cadena se activa solo para $message_type = 1 y denota encabezados de correo electrónico

La función error_log() trabaja estrechamente con log_errors y las opciones de configuración de error_log definidas en php.ini:

  • log_errors: esta es una opción de configuración de tipo booleano. Indica si los mensajes de error deben registrarse en el registro de errores del servidor o en el error_log. Para iniciar sesión en un archivo especificado con la opción de configuración error_log, configúrelo en 1.
  • error_log: esta es una opción de configuración de tipo de cadena. Especifica el nombre del archivo donde se deben registrar los errores. Si se usa syslog, los errores se registran en el registrador del sistema. Si no se establece ningún valor, los errores se envían al registrador de errores de SAPI, que probablemente sea un registro de errores en Apache o stderr en la CLI.

El siguiente ejemplo muestra el registro en un archivo:

<?php
ini_set('log_errors', 1);
ini_set('error_log', dirname(FILE) . '/app-error.log');
error_log('Test!');

Las opciones log_errors y error_log pueden definirse en el archivo .php mismo; sin embargo, se recomienda hacerlo en php.ini, de lo contrario, el registro no registrará ningún error si el script tiene errores de análisis o no se puede ejecutar en absoluto. El resultado resultante del ejemplo anterior sería un archivo app-error.log, ubicado en el mismo directorio que el script en ejecución con el siguiente contenido:

[26-Dec-2016 08:11:32 UTC] Test!
[26-Dec-2016 08:11:39 UTC] Test!
[26-Dec-2016 08:11:42 UTC] Test!

El siguiente ejemplo muestra el registro en un correo electrónico:

<?php
ini_set('log_errors', 1);
ini_set('error_log', dirname(FILE) . '/app-error.log');
$headers = "From: john@server.loc\r\n";
$headers .= "Subject: My PHP email logger\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: text/html; charset=ISO-8859-1\r\n";
error_log('Test!', 1, 'john@mail.com', $headers);

Aquí, primero estamos construyendo la cadena sin procesar $headers, que luego pasamos a la función error_log(), junto con la dirección de correo electrónico de destino. Este es un inconveniente obvio de la función error_log(), ya que debemos estar familiarizados con los estándares de encabezados de mensajes de correo electrónico.

La función error_log () no es segura para binarios, lo que significa el argumento $message no debe contener un carácter nulo; de lo contrario, se truncará. Para evitar esta limitación, podemos usar una de las funciones de conversión / escape, como base64_encode(), rawurlencode(), o addlashes() antes de llamar a error_log(). Los siguientes RFC pueden ser útiles para tratar con encabezados de mensajes de correo electrónico: RFC 1896, RFC 2045, RFC 2046, RFC 2047, RFC 2048, RFC 2049 y RFC 2822.

Al comprender la función error_log(), podemos envolverla fácilmente en una función personalizada nuestra, digamos app_error_log(), abstrayendo así toda la plantilla de los correos electrónicos, como la dirección y los encabezados. También podemos hacer que nuestra función app_error_log() registre en el archivo y el correo electrónico a la vez, lo que crea una expresión de registro simple de una línea, como el siguiente, posiblemente en nuestra aplicación:

try {
//…
}
catch (\Exception $e) {
app_error_log($e);
}

Escribir registradores simples como estos es bastante fácil. Sin embargo, la simplicidad en el desarrollo generalmente conlleva el costo de una modularidad reducida. Afortunadamente, hay bibliotecas de terceros que son bastante robustas cuando se trata de funciones de registro. Lo mejor de todo es que cumplen con un cierto estándar de registro, como veremos en la siguiente sección.

Comparte