Пишем класс для логирования на PHP

12-10-21 Php 1

В этом уроке мы напишем класс для логирования, который также очень пригодится при отладке 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__);

На этом все, не пропустите новые уроки! 🙂

Хочешь получать статьи на почту?

Подпишись на обновления!
* Ваш email не будет разглашен/продан. Вы сможете отписаться в любое время.

1 Комментарий

  1. Maksim:

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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *