Пишем класс для логирования на 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__);
На этом все, не пропустите новые уроки! 🙂







А можно поподробнее про то как подключить данный класс и как логировать?