Пишем класс для логирования на PHP
В этом уроке мы напишем класс для логирования, который также очень пригодится при отладке php кода.
Лог — это файл в котором хранятся записи о событиях на сервере. Логи необходимо вести для отслеживания информации о посетителях и их действиях на сервере. В этом уроке мы напишем класс для логирования. С помощью нашего класса можнобудет работать с несколькими файлами одновременно.
PHP
Приступим к написанию кода. Пусть наш класс будет находиться в файле Logger.php
<?php class Logger { //статические переменные public static $PATH; protected static $loggers=array(); protected $name; protected $file; protected $fp; } ?>
В статической переменной $PATH будет храниться папка с лог-файлами. Переменная $loggers будет содержать массив с логгеров с разными файлами. $name — имя текущего логгера, $file -путь к файлу, с которым он работает, $fp — файловый поток, через который осуществляется запись. Добавим конструктор:
public function __construct($name, $file=null){ $this->name=$name; $this->file=$file; $this->open(); } public function open(){ if(self::$PATH==null){ return ; } $this->fp=fopen($this->file==null ? self::$PATH.'/'.$this->name.'.log' : self::$PATH.'/'.$this->file,'a+'); }
Функция open инициализирует наш файловый поток, если переменная $file не задана, то будет открыт файл с тем же именем, что и логгер. Конструктор будет использоваться внутри класса, непосредственно при логировании мы будем пользоваться следующей функцией:
public static function getLogger($name='root',$file=null){ if(!isset(self::$loggers[$name])){ self::$loggers[$name]=new Logger($name, $file); } return self::$loggers[$name]; }
Эта функция возвратит нам логгер, имя которого мы указали. Теперь опишем функции, которые будут заносить нашу информацию в файлы.
public function log($message){ if(!is_string($message)){ // если мы хотим вывести, к примеру, массив $this->logPrint($message); return ; } $log=''; // зафиксируем дату и время происходящего $log.='['.date('D M d H:i:s Y',time()).'] '; // если мы отправили в функцию больше одного параметра, // выведем их тоже if(func_num_args()>1){ $params=func_get_args(); $message=call_user_func_array('sprintf',$params); } $log.=$message; $log.="\n"; // запись в файл $this->_write($log); } public function logPrint($obj){ // заносим все выводимые данные в буфер ob_start(); print_r($obj); // очищаем буфер $ob=ob_get_clean(); // записываем $this->log($ob); } protected function _write($string){ fwrite($this->fp, $string); } // деструктор public function __destruct(){ fclose($this->fp); }
Полный код класса:
class Logger { //статические переменные public static $PATH; protected static $loggers=array(); protected $name; protected $file; protected $fp; public function __construct($name, $file=null){ $this->name=$name; $this->file=$file; $this->open(); } public function open(){ if(self::$PATH==null){ return ; } $this->fp=fopen($this->file==null ? self::$PATH.'/'.$this->name.'.log' : self::$PATH.'/'.$this->file,'a+'); } public static function getLogger($name='root',$file=null){ if(!isset(self::$loggers[$name])){ self::$loggers[$name]=new Logger($name, $file); } return self::$loggers[$name]; } public function log($message){ if(!is_string($message)){ $this->logPrint($message); return ; } $log=''; $log.='['.date('D M d H:i:s Y',time()).'] '; if(func_num_args()>1){ $params=func_get_args(); $message=call_user_func_array('sprintf',$params); } $log.=$message; $log.="\n"; $this->_write($log); } public function logPrint($obj){ ob_start(); print_r($obj); $ob=ob_get_clean(); $this->log($ob); } protected function _write($string){ fwrite($this->fp, $string); echo $string; } public function __destruct(){ fclose($this->fp); } }
Наш класс готов, осталось только использовать его. Для логирования будет использоваться следующая конструкция:
Logger::getLogger($name)->log($data);
Статическая функция getLogger() возвратит логгер, который мы вызвали, далее функция log() запишет наши данные. Но перед этим необходимо задать путь, где будут храниться логи. Например та же папка, где и файл из которого мы вызвали логгер:
Logger::$PATH = dirname(__FILE__);
На этом все, не пропустите новые уроки! 🙂
А можно поподробнее про то как подключить данный класс и как логировать?