¿Cómo registro errores y advertencias en un archivo?

233

¿Cómo activo todos los errores y advertencias y los registro en un archivo, pero para configurar todo eso dentro del script (sin cambiar nada en php.ini)?

Quiero definir un nombre de archivo y para que todos los errores y advertencias se registren en él.

Gorep
fuente

Respuestas:

358

Utiliza el siguiente código:

ini_set("log_errors", 1);
ini_set("error_log", "/tmp/php-error.log");
error_log( "Hello, errors!" );

Luego mira el archivo:

tail -f /tmp/php-error.log

O actualice php.inicomo se describe en esta entrada de blog de 2008.

Un hombre
fuente
41
ini_setsolo funciona si ese código se ejecuta. No es útil para el código que tiene errores de análisis porque el error será antes de que se ejecute el código. En cambio, escriba esos cambios en php.ini.
Hakre
99
Si no puede editar php.ini, debería ser capaz de añadir esto en el .htaccess: php_flag log_errors on php_value error_log /home/path/public_html/domain/PHP_errors.log. Ver perishablepress.com/…
Matthieu
1
Tengo una pregunta, ¿cómo obtener el archivo error.log para crearlo en mi carpeta htdocs?
Tommy
Supongo que simplemente cambias la carpeta desde tmp/php-error.logla ubicación que desees.
Lucas
Esto bloquea mi PHP en 5.4.0
Supuhstar
42

Simplemente ponga estos códigos en la parte superior de su archivo PHP / índice:

error_reporting(E_ALL); // Error/Exception engine, always use E_ALL

ini_set('ignore_repeated_errors', TRUE); // always use TRUE

ini_set('display_errors', FALSE); // Error/Exception display, use FALSE only in production environment or real server. Use TRUE in development environment

ini_set('log_errors', TRUE); // Error/Exception file logging engine.
ini_set('error_log', 'your/path/to/errors.log'); // Logging file path
Yousha Aleayoub
fuente
44
Eso es solo si también desea que se muestren todos los errores en la salida y / o en el navegador, además del registro. display_errorsNUNCA debe activarse en un servidor de producción en vivo: esa directiva es específicamente para la salida al usuario y no tiene ningún efecto en el registro. php.net/manual/en/…
Aaron Wallentine
22

agregue este código en .htaccess (como alternativa a la función php.ini / ini_set ):

<IfModule mod_php5.c>
php_flag log_errors on 
php_value error_log ./path_to_MY_PHP_ERRORS.log
# php_flag display_errors on 
</IfModule>

* como se comentó: esto es para servidores de tipo Apache , y no para Nginx u otros.

T.Todua
fuente
77
Sin embargo, esto tiene que ver muy específicamente con el módulo PHP de Apache.
SacredSkull
9

Esa es mi corta función personal

# logging
/*
[2017-03-20 3:35:43] [INFO] [file.php] Here we are
[2017-03-20 3:35:43] [ERROR] [file.php] Not good
[2017-03-20 3:35:43] [DEBUG] [file.php] Regex empty

mylog ('hallo') -> INFO
mylog ('fail', 'e') -> ERROR
mylog ('next', 'd') -> DEBUG
mylog ('next', 'd', 'debug.log') -> DEBUG file debug.log
*/
function mylog($text, $level='i', $file='logs') {
    switch (strtolower($level)) {
        case 'e':
        case 'error':
            $level='ERROR';
            break;
        case 'i':
        case 'info':
            $level='INFO';
            break;
        case 'd':
        case 'debug':
            $level='DEBUG';
            break;
        default:
            $level='INFO';
    }
    error_log(date("[Y-m-d H:i:s]")."\t[".$level."]\t[".basename(__FILE__)."]\t".$text."\n", 3, $file);
}
Juergen
fuente
6

Eche un vistazo a la log_errorsopción de configuración en php.ini. Parece hacer justo lo que quieres. Creo que también puede usar la error_logopción para configurar su propio archivo de registro.

Cuando la log_errorsdirectiva se establece en On, cualquier error informado por PHP se registrará en el registro del servidor o en el archivo especificado con error_log. También puede configurar estas opciones ini_setsi es necesario.

(Tenga en cuenta que display_errorsdebe deshabilitarse en php.ini si esta opción está habilitada)

Frxstrem
fuente
1
¿Por qué debería display_errorsdeshabilitarse si habilita log_errors? No tiene sentido en mi opinión. :)
Guido Hendriks
55
Debido a que no es necesario enviar el contenido de los errores al público en un servidor de producción, especialmente si el texto del error se registra discretamente en un archivo.
Shabbyrobe
3
Los errores de visualización siempre deben deshabilitarse en el servidor de producción. No si el registro de errores está configurado en otro lugar, sino siempre. Los errores se registran en el registro de errores de Apache de forma predeterminada, que a menudo es suficiente.
Pihhan
1
Mostrar errores en la producción hace que PHP sea más popular :)
PeterM
0

Además, necesita la directiva "AllowOverride Options" para que esto funcione. (Apache 2.2.15)

Stéphane
fuente