1
0
Fork 0
mirror of https://github.com/Oreolek/ifhub.club.git synced 2024-07-01 14:05:07 +03:00
ifhub.club/engine/modules/logger/Logger.class.php
2011-04-27 07:44:28 +00:00

324 lines
7.7 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/*-------------------------------------------------------
*
* LiveStreet Engine Social Networking
* Copyright © 2008 Mzhelskiy Maxim
*
*--------------------------------------------------------
*
* Official site: www.livestreet.ru
* Contact e-mail: rus.engine@gmail.com
*
* GNU General Public License, version 2:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
*
---------------------------------------------------------
*/
/**
* Модуль логирования
* Имеет 3 уровня логирования: 'DEBUG','NOTICE','ERROR'
*
*/
class ModuleLogger extends Module {
/**
* Уровни логгирования
*
* @var array
*/
protected $logLevel=array('DEBUG','NOTICE','ERROR');
/**
* Текущий уровень логирования
*
* @var int
*/
protected $writeLevel=0;
/**
* Использовать или нет трассировку
*
* @var bool
*/
protected $bUseTrace=false;
/**
* Имя файла куда писать лог
*
* @var string
*/
protected $sFileName=null;
/**
* Путь до каталога с логами
*
* @var string
*/
protected $sPathLogs=null;
/**
* Использовать автоматическую ротация логов
*
* @var bool
*/
protected $bUseRotate=false;
/**
* Максимальный размер файла при ротации логов в байтах
*
* @var int
*/
protected $iSizeForRotate=1000000;
/**
* Случайное число
*
* @var unknown_type
*/
protected $iRandom;
/**
* Инициализация, устанавливает имя файла лога
*
*/
public function Init() {
$this->sPathLogs=Config::Get('path.root.server').'/logs/';
$this->SetFileName(Config::Get('sys.logs.file'));
$this->iRandom=rand(1000,9999);
}
/**
* Уставливает текущий уровень лога, тот уровень при котором будет производиться запись в файл лога
*
* @param int, string('DEBUG','NOTICE','ERROR') $level
* @return bool
*/
public function SetWriteLevel($level) {
if (preg_match("/^\d$/",$level) and isset($this->logLevel[$level])) {
$this->writeLevel=$level;
return true;
}
$level=strtoupper($level);
if ($key=array_search($level,$this->logLevel)) {
$this->writeLevel=$key;
return true;
}
return false;
}
/**
* Возвращает текущий уровень лога
*
* @return int
*/
public function GetWriteLevel() {
return $this->writeLevel;
}
/**
* Использовать трассировку или нет
*
* @param bool $bool
*/
public function SetUseTrace($bool) {
$this->bUseTrace=(bool)$bool;
}
/**
* Использует трассировку или нет
*
* @return bool
*/
public function GetUseTrace() {
return $this->bUseTrace;
}
/**
* Использовать ротацию логов или нет
*
* @param bool $bool
*/
public function SetUseRotate($bool) {
$this->bUseRotate=(bool)$bool;
}
/**
* Использует ротацию логов или нет
*
* @return bool
*/
public function GetUseRotate() {
return $this->bUseRotate;
}
/**
* Устанавливает имя файла лога
*
* @param string $sFile
*/
public function SetFileName($sFile){
$this->sFileName=$sFile;
}
/**
* Получает имя файла лога
*
* @return string
*/
public function GetFileName(){
return $this->sFileName;
}
/**
* Запись в лог с уровнем логирования 'DEBUG'
*
* @param string $msg
*/
public function Debug($msg) {
$this->log($msg,'DEBUG');
}
/**
* Запись в лог с уровнем логирования 'ERROR'
*
* @param string $msg
*/
public function Error($msg) {
$this->log($msg,'ERROR');
}
/**
* Запись в лог с уровнем логирования 'NOTICE'
*
* @param string $msg
*/
public function Notice($msg) {
$this->log($msg,'NOTICE');
}
/**
* Записывает лог
*
* @param string $msg
* @param string $sLevel
*/
protected function log($msg,$sLevel) {
/**
* Если уровень записи в лог больше либо равен текущему уровню то пишем в лог
*/
if (($key=array_search(strtoupper($sLevel),$this->logLevel))!==false and $key>=$this->writeLevel) {
/**
* Формируем текст лога
*/
$msgOut ='['.date("Y-m-d H:i:s").']';
$msgOut.='['.getmypid().']';
$msgOut.='['.$this->iRandom.']';
$msgOut.='['.$this->logLevel[$key].']';
$msgOut.='['.$msg.']';
/**
* Если нужно то трассируем
*/
if ($this->getUseTrace()) {
$msgOut.='['.$this->parserTrace(debug_backtrace()).']';
}
/**
* Записываем
*/
$this->write($msgOut);
}
}
/**
* Выполняет форматирование трассировки
*
* @param array $aTrace
* @return unknown
*/
protected function parserTrace($aTrace) {
$msg='';
for ($i=count($aTrace)-1;$i>=0;$i--) {
if (isset($aTrace[$i]['class'])) {
$funct=$aTrace[$i]['class'].$aTrace[$i]['type'].$aTrace[$i]['function'].'()';
} else {
$funct=$aTrace[$i]['function'].'()';
}
$msg.=$aTrace[$i]['file'].'(line:'.$aTrace[$i]['line'].'){'.$funct.'}';
if ($i!=0) {
$msg.=' => ';
}
}
return $msg;
}
/**
* Производит сохранение в файл
*
* @param string $msg
* @return unknown
*/
protected function write($msg) {
/**
* Если имя файла не задано то ничего не делаем
*/
if (is_null($this->sFileName) or $this->sFileName=='') {
//throw new Exception("Empty file name for log!");
return false;
}
/**
* Если имя файла равно '-' то выводим сообщение лога на экран(браузер)
*/
if ($this->sFileName=='-') {
echo($msg."<br>\n");
} else {
/**
* Запись в файл
*/
if ($fp=fopen($this->sPathLogs.$this->sFileName,"a")) {
fwrite($fp,$msg."\n");
fclose($fp);
/**
* Если нужно то делаем ротацию
*/
if ($this->bUseRotate) {
$this->rotate();
}
}
}
}
/**
* Производит ротацию логов
*
*/
protected function rotate() {
clearstatcache();
/**
* Если размер файло лога привысил максимальный то сохраняем текущий файл в архивный, а текущий становится пустым
*/
if (filesize($this->sPathLogs.$this->sFileName)>=$this->iSizeForRotate) {
$pathinfo=pathinfo($this->sPathLogs.$this->getFileName());
$name=$pathinfo['basename'];
$aName=explode('.',$name);
$i=1;
while (1) {
$sNameNew=$aName[0].".$i.".$aName[1];
$sFullNameNew=$pathinfo['dirname'].'/'.$sNameNew;
if (!file_exists($sFullNameNew)) {
$this->rotateRename($i-1);
break;
}
$i++;
}
}
}
/**
* Переименовывает все файлы логов согласно их последовательности
*
* @param int $numberLast
*/
protected function rotateRename($numberLast) {
$pathinfo=pathinfo($this->sPathLogs.$this->getFileName());
$aName=explode('.',$pathinfo['basename']);
for ($i=$numberLast;$i>0;$i--) {
$sFullNameCur=$pathinfo['dirname'].'/'.$aName[0].".$i.".$aName[1];
$sFullNameNew=$pathinfo['dirname'].'/'.$aName[0].'.'.($i+1).'.'.$aName[1];
rename($sFullNameCur,$sFullNameNew);
}
rename($this->sPathLogs.$this->getFileName(),$pathinfo['dirname'].'/'.$aName[0].".1.".$aName[1]);
}
}
?>