Clase de Logs para PHP

Por más entorno de debug que exista, los archivos de log son fundamentales para tracear el comportamiento de cualquier aplicación. Una aplicación web escrita en PHP no se escapa de este requerimiento tampoco.

Por tal motivo, navegando, encontré una sencilla clase para generar archivos de log. Y como siempre se necesita tener a mano código como tal, no viene mal su publicación.

El código de la clase es pequeño y sencillo, muestra por cada línea la hora y fecha en la que se escribió, así como arrays formateados. Algunas mejoras que se le pueden realizar, pero que no se escriben para no manchar el código original del autor son:

Ahora si, el código y luego un pequeño ejemplo de su utilización:

[PHP]
/**
* myLogger
* @author Edder Rojas Douglas
* @version 0.2
*/

class myLogger {
protected $_fileName = ‘myLogger.log’;

/**
* @param string $path can be a directory o a file path
*/
public function __construct($path) {
if (empty($path)){
Throw new Exception(“Path must be filled”);
}
if (!file_exists($path)) {
Throw new Exception(“The Path doesn’t exists.”);
}
if (!is_writeable($path)) {
Throw new Exception(“You can write on the give path”);
}
$this->_path = $this->_parsePath($path);
}

/**
* Validate the path the add the filename to the path
* @param String $path
* @return String
*/
protected function _parsePath($path) {
$strLenght = strlen($path);
$lastChar = substr($path, $strLenght – 1, $strLenght);
$path = $lastChar != “/” ? $path . “/” : $path;

if ( is_dir($path) ) {
return $path . $this->_fileName;
} else {
return $path;
}
}

/**
* Will save the path on the give path
* @param String $line
*/
protected function _save($line) {
$fhandle = fopen ($this->_path, “a+”);
f write($fhandle, $line);
fclose($fhandle);
}

/**
* main function to add lines to the logging file
* @param String $line
*/
public function addLine($line){
$line = is_array($line) ? print_r($line, true) : $line;
$line = date(“d-m-Y h:i:s”) . “: $line\n”;
$this->_save($line);
}
}

[/PHP]

[PHP]
require_once(‘myLogger.php’);

$log = new myLogger(dirname(__FILE__) . “/log”);
$log->addLine(array(“testing”, “my”, ‘data’));
[/PHP]

Vía: Pain Dev

Tags: , , , , ,


  • Bline

    Bastante curioso, yo en un cms que estoy elaborando tengo algo parecido, quizas no tan completo pero si con mas informacion:

    Es una mera funcion contenida por una clase que se encarga de realizar una traza hasta el lugar donde ha fallado el script aportando quizas un exceso de informacion pero que puede ayudar a debugear.

    //—————————————————————-
    // Funcion: lanzar_error
    // Ambito: Privado
    // Simplemente lanza un error con el mensaje indicado

    private function lanzar_error( $mensaje ){
    if ( true ){
    throw new Exception( $mensaje , $errorn );
    }
    }

    //—————————————————————-
    // Funcion: error
    // Ambito: Publico
    // Realiza una traza inversa desde donde se produjo el error hasta
    // el fichero fuente de inclusión para realizar un mejor depurado.

    public function error( $m ){

    global $error;

    try {
    $this->lanzar_error($m,$n);

    } catch ( Exception $e ) {

    $traza = $e->getTrace();
    foreach( $traza as $num => $t ){
    echo ‘
    [+/-] Traza #’,$num,”;
    echo ‘Mensaje : ‘,$m,”;
    foreach( $t as $etiqueta => $mensaje ){
    if (!is_array($mensaje)){
    if ( $mensaje != ‘->’ ){
    echo ‘‘,$etiqueta,’ : ‘,$mensaje,”;
    }
    }else{
    if ( $mensaje != ‘->’ ){
    echo ‘‘,$etiqueta,’ : ‘;
    print_r($mensaje);
    echo ”;
    }
    }
    }
    echo ”;
    }

    exit();

    }

    } // Fin funcion error

    Reply

  • Rubén

    Hombre, la clase está bien para el propósito que tiene, un logger sencillito, pero lo más adecuado sería poder tener distintos niveles de prioridad para reducir o ampliar el nivel de logging según sea necesario, incluso poder desactivarlo completamente sin tener que tocar el código.

    Yo tengo mi propia versión haciendo uso de Zend_Log que es muchisimo más flexible:
    http://framework.zend.com/manual/en/zend.log.html

    Recomendado 100%

    Reply

  • cce

    En caso de implementar este tipo de logging, y si se presenta que varios usuarios se conectan en forma simultanea, como se realiza el logging?…tendra problemas en grabar el archivo de texto?…como hacer que todos puedan acceder sin que se pierda informacion?…..

    convendria utilizar la misma base de datos para hacer una registro de logeo?

    Saludos.-

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.