分享一个用了很久的php日志类
2012-09-07 17:00
260 查看
<?php class Logs{ private $FilePath; private $FileName; private $m_MaxLogFileNum; private $m_RotaType; private $m_RotaParam; private $m_InitOk; private $m_Priority; private $m_LogCount; /** * @abstract 初始化 * @param String $dir 文件路径 * @param String $filename 文件名 * @return */ function Logs($dir, $filename, $priority = Logs::INFO, $maxlogfilenum = 3, $rotatype = 1, $rotaparam = 5000000) { $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 InitDir() { if (is_dir($this->FilePath) === false) { if(!$this->createDir($this->FilePath)) { //echo("创建目录失败!"); //throw exception return false; } } return true; } /** * @abstract 写入日志 * @param String $log 内容 */ function setLog($log) { $this->Log(Logs::NOTICE, $log); } function LogDebug($log) { $this->Log(Logs::DEBUG, $log); } function LogError($log) { $this->Log(Logs::ERROR, $log); } function LogNotice($log) { $this->Log(Logs::NOTICE, $log); } function Log($priority, $log) { if ($this->m_InitOk == false) return; if ($priority > $this->m_Priority) return; $path = $this->getLogFilePath($this->FilePath, $this->FileName).".log"; $handle=@fopen($path,"a+"); if ($handle === false) { return; } $datestr = strftime("%Y-%m-%d %H:%M:%S "); $caller_info = $this->get_caller_info(); //var_dump($caller_info); if(!@fwrite($handle, $caller_info.$datestr.$log."\n")){//写日志失败 //echo("写入日志失败"); } @fclose($handle); $this->RotaLog(); } 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"; 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"; //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"; else $file_path = $raw_file_path.$i.".log"; if ($this->isExist($file_path)) { $new_file_path = $raw_file_path.($i+1).".log"; 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"); //创建文件 @fclose($handle); return $this->isExist($path); } /** * @abstract 创建路径 * @param String $dir 目录名 * @param String $filename */ function getLogFilePath($dir,$filename){ return $dir."/".$filename; } 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; } ?>
这里面有一个精妙的语句:
function createDir($dir){ return is_dir($dir) or ($this->createDir(dirname($dir)) and @mkdir($dir, 0777)); }
使用方法:
require("../log.class.php"); $log_path = DEBUG_LOG_PATH.'account_check/'; $log_file_name = 'debug.log'; $log_obj = new Logs($log_path, $log_file_name); $log_obj->setLog("param is:userid:{$userip}, account:{$account},pwd:{$pwd}, rid:{$rid}");
相关文章推荐
- 一个个人觉得比较好用的PHP日志类,给大家分享一下
- 分享一个PHP调试日志类
- 分享一个PHP写的简单webservice服务端+客户端
- 分享一个php短信验证码接口实例
- 分享一个记录日志的类,可多线程使用。
- 一个PHP的远程图片抓取函数分享
- 一个典型的PHP分页实例代码分享
- 一个经典的PHP验证码类分享
- 分享一个简易的程序日志记录C++类
- PHP+YII学习日志 ----建立一个应用
- 一个典型的PHP分页实例代码分享
- 一个典型的PHP分页实例代码分享
- 一个漂亮的php验证码类(分享)
- 一个典型的PHP分页实例代码分享
- 單身咒的伤感日志分享:每个人都有一个死角
- 分享一个php短信验证码接口实例
- 分享一个blog,php开发的……不错
- 一个经典实用的PHP图像处理类分享
- 分享一个PHP抽奖算法程序代码
- 一个PHP验证码类代码分享(已封装成类)