Maison > Article > développement back-end > PHP 日志工具类
好久没写php了,突然做个实验,发现竟然没有日志,哎
<?phpdefined('API') or exit('Access Denied');class Log{ private $FilePath; private $FileName; private $m_MaxLogFileNum; private $m_RotaType; private $m_RotaParam; private $m_InitOk; private $m_Priority; private $m_LogCount; const EMERG = 0; const FATAL = 0; const ALERT = 100; const CRIT = 200; const ERROR = 300; const WARN = 400; const NOTICE = 500; const INFO = 600; const DEBUG = 700; const LOG_SUFFIXED = ".log.txt"; const DEFAULT_ROTE = 5242880; /** * @abstract 初始化 * @param String $dir 文件路径 * @param String $filename 文件名 * @return */ public function __construct($dir, $filename, $priority = Log::INFO, $maxlogfilenum = 3, $rotatype = 1, $rotaparam = LOG::DEFAULT_ROTE) { $dot_offset = strpos($filename, "."); if ($dot_offset !== false) $this->FileName = substr($filename,0, $dot_offset); else $this->FileName = $filename; $this->FilePath = $dir; $this->m_MaxLogFileNum = intval($maxlogfilenum); $this->m_RotaParam = intval($rotaparam); $this->m_RotaType = intval($rotatype); $this->m_Priority = intval($priority); $this->m_LogCount = 0; $this->m_InitOk = $this->InitDir(); umask(0000); $path=$this->createPath($this->FilePath,$this->FileName); if(!$this->isExist($path)) { if(!$this->createDir($this->FilePath)) { #echo("创建目录失败!"); } if(!$this->createLogFile($path)){ #echo("创建文件失败!"); } } } private function createPath($dir,$file) { $file = fopen($dir.DIRECTORY_SEPARATOR.$file,'w'); if($file) { fclose($file); } return $dir.DIRECTORY_SEPARATOR.$file; } private function InitDir() { if (is_dir($this->FilePath) === false) { if(!$this->createDir($this->FilePath)) { //echo("创建目录失败!"); //throw exception return false; } } return true; } function console($priority, $log) { if ($this->m_InitOk == false) return; if ($priority > $this->m_Priority) return; $path = $this->getLogFilePath($this->FilePath, $this->FileName).Log::LOG_SUFFIXED; $handle= fopen($path,"a+"); if ($handle === false) { return; } $datestr = strftime("%Y-%m-%d %H:%M:%S "); $caller_info = $this->get_caller_info(); $status = fwrite($handle, $caller_info.$datestr.$log."\n"); if(!$status){//写日志失败 echo("写入日志失败"); } fclose($handle); $this->RotaLog(); } /** * @abstract 写入日志 * @param String $log 内容 */ function setLog($log) { $this->console(Log::NOTICE, $log); } function LogDebug($log) { $this->console(Log::DEBUG, $log); } function LogError($log) { $this->console(Log::ERROR, $log); } function LogNotice($log) { $this->console(Log::NOTICE, $log); } private function get_caller_info() { $ret = debug_backtrace(); foreach ($ret as $item) { if(isset($item['class']) && 'Logs' == $item['class']) { continue; } $file_name = basename($item['file']); return <<<S {$file_name}:{$item['line']} S; } } private function RotaLog() { $file_path = $this->getLogFilePath($this->FilePath, $this->FileName).LOG::LOG_SUFFIXED; if ($this->m_LogCount%10==0) clearstatcache(); ++$this->m_LogCount; $file_stat_info = stat($file_path); if ($file_stat_info === FALSE) return; if ($this->m_RotaType != 1) return; //echo "file: ".$file_path." vs ".$this->m_RotaParam."\n"; if ($file_stat_info['size'] < $this->m_RotaParam) return; $raw_file_path = $this->getLogFilePath($this->FilePath, $this->FileName); $file_path = $raw_file_path.($this->m_MaxLogFileNum - 1).LOG::LOG_SUFFIXED; //echo "lastest file:".$file_path."\n"; if ($this->isExist($file_path)) { unlink($file_path); } for ($i = $this->m_MaxLogFileNum - 2; $i >= 0; $i--) { if ($i == 0) $file_path = $raw_file_path.LOG::LOG_SUFFIXED; else $file_path = $raw_file_path.$i.LOG::LOG_SUFFIXED; if ($this->isExist($file_path)) { $new_file_path = $raw_file_path.($i+1).LOG::LOG_SUFFIXED; if (rename($file_path, $new_file_path) < 0) { continue; } } } } function isExist($path){ return file_exists($path); } /** * @abstract 创建目录 * @param <type> $dir 目录名 * @return bool */ function createDir($dir){ //判断目录是否存在 return is_dir($dir) or ($this->createDir(dirname($dir)) and mkdir($dir, 0777)); } /** * @abstract 创建日志文件 * @param String $path * @return bool */ function createLogFile($path){ $handle=fopen($path,"w"); //创建文件 if($handle) { fclose($handle); } return $this->isExist($path); } /** * @abstract 创建路径 * @param String $dir 目录名 * @param String $filename */ function getLogFilePath($dir,$filename){ return $dir."/".$filename; }}?>