Zend_Log po swojemu

Gdy już przetestujemy i uruchomimy program często okazuje się po jakimś czasie, że jednak coś przeoczyliśmy. Wtedy bezcenne są logi z działania programu.

Wystarczy w trakcie pisania zadbać o logowanie ważniejszych informacji a w miejscach potencjalnych nieprawidłowości napisać jedną linijkę np:
[sourcecode lang=”php”]Log::error(‚To jest coś nie tak’);[/sourcecode]
dzięki temu wiemy gdzie i kiedy oraz w jakich okolicznościach powstała ta sytuacja. To jest bardzo pomocne przy usuwaniu owych usterek.

Ciekawym może być też przechwytywanie błędów PHP i ich logowanie wystarczy dodać:

set_error_handler("Log::errorHandler");

dzięki temu użytkownika nie niepokoimy groźnymi komunikatami a my wiemy wszystko co i kiedy się stało.

Opisana klasa przechowuje logi w bazie danych w tabeli:

CREATE TABLE IF NOT EXISTS `log` (
   `log_ig` int(11) NOT NULL auto_increment,
   `timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
   `message` text collate utf8_polish_ci NOT NULL,
   `priority` int(11) NOT NULL,
   `priorityName` varchar(8) collate utf8_polish_ci NOT NULL,
PRIMARY KEY (`log_ig`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=1 ;

ale modyfikując metodę getLogger() i zmieniają writer można je zapisywać do pliku lub nawet wysyłać mailem

A oto wspomniana klasa

/**
* Klasa Logująca
* @author Tomasz Imbierczak
* @since 2010-02-02
* @version 1.0.0
*/
class Log {

/**
*
* @return Zend_Log
*/
private static function getLogger() {
Zend_Loader::loadClass('Zend_Log_Writer_Db');
$db = Zend_Db_Table::getDefaultAdapter();
$writer = new Zend_Log_Writer_Db($db, 'log');
$logger = new Zend_Log($writer);
return $logger;
}

/**
* Log a message at a priority
*
* @param  string   $message   Message to log
* @param  integer  $priority  Priority of message
* @param  boolean  $description Include full description in message
* @param  boolean  $show Show log on screen
* @return void
* @throws Zend_Log_Exception
*/
public static function logging($message, $priority, $description = true, $show = false) {
Zend_Loader::loadClass('Zend_Log');

if($description) {
$debugBacktrace = debug_backtrace();
if(isset ($debugBacktrace[1]['file']) && isset ($debugBacktrace[1]['line'])) {
$message .= "\n".' # '.$debugBacktrace[1]['file'].' w linii '.$debugBacktrace[1]['line'].' # ';
}
if(isset ($_SERVER["REQUEST_URI"])) {
$message .= "\n".' # '.$_SERVER["REQUEST_URI"].' # ';
}
}

self::getLogger()->log($message, $priority);

if($show) {
echo '
<pre style="background-color: yellow; padding: 5px;"><strong>Log:</strong> [priority: '.$priority.'] '.$message.'</pre>
';
}
}

/**
* Log: Emergency: system is unusable
*
* @param string $message
*/
public static function emergency($message) {
Zend_Loader::loadClass('Zend_Log');
self::logging($message, Zend_Log::EMERG);
}

/**
* Log: Alert: action must be taken immediately
*
* @param string $message
*/
public static function alert($message) {
Zend_Loader::loadClass('Zend_Log');
self::logging($message, Zend_Log::ALERT);
}

/**
* Log: Critical: critical conditions
*
* @param string $message
*/
public static function critical($message) {
Zend_Loader::loadClass('Zend_Log');
self::logging($message, Zend_Log::CRIT);
}

/**
* Log: Error: error conditions
*
* @param string $message
*/
public static function error($message) {
Zend_Loader::loadClass('Zend_Log');
self::logging($message, Zend_Log::ERR);
}

/**
* Log: Warning: warning conditions
*
* @param string $message
*/
public static function warning($message) {
Zend_Loader::loadClass('Zend_Log');
self::logging($message, Zend_Log::WARN);
}

/**
* Log: Notice: normal but significant condition
*
* @param string $message
*/
public static function notice($message) {
Zend_Loader::loadClass('Zend_Log');
self::logging($message, Zend_Log::NOTICE);
}

/**
* Log: Informational: informational messages
*
* @param string $message
*/
public static function info($message) {
Zend_Loader::loadClass('Zend_Log');
self::logging($message, Zend_Log::INFO);
}

/**
* Log: Debug: debug messages
*
* @param string $message
*/
public static function debug($message) {
Zend_Loader::loadClass('Zend_Log');
self::logging($message, Zend_Log::DEBUG);
}

/**
* Uchwyt do błędów systemowych.
*
* Przechwytuje wszystkie błędy PHP i loguje je według priorytetu.
*
* @uses set_error_handler("Log::errorHandler");
* @param int $errno
* @param string $errstr
* @param string $errfile
* @param int $errline
* @param array $errcontext
* @return boolean
*/
public static function errorHandler($errno, $errstr, $errfile, $errline, $errcontext) {
Zend_Loader::loadClass('Zend_Log');
switch ($errno) {

case E_ERROR:
case E_USER_ERROR:
case E_PARSE:
case E_COMPILE_ERROR:
case E_CORE_ERROR:
case E_RECOVERABLE_ERROR:
case E_STRICT:
self::logging($errstr.' (kod: '.$errno.') w pliku '.$errfile.'w linii '.$errline, Zend_Log::ERR, false, true);
exit(1);
break;

case E_USER_WARNING:
case E_COMPILE_WARNING:
case E_CORE_WARNING:
case E_WARNING:
self::logging($errstr.' (kod: '.$errno.') w pliku '.$errfile.'w linii '.$errline, Zend_Log::WARN, false, true);
break;

case E_USER_NOTICE:
case E_NOTICE:
self::logging($errstr.' (kod: '.$errno.') w pliku '.$errfile.'w linii '.$errline, Zend_Log::NOTICE, false, true);
break;

default:
self::logging($errstr.' (kod: '.$errno.') w pliku '.$errfile.'w linii '.$errline, Zend_Log::EMERG, false, true);
break;
}

/* Don't execute PHP internal error handler */
return true;
}
}

1 thought on “Zend_Log po swojemu

Comments are closed.