文档章节

PHP 日志工具类

IamOkay
 IamOkay
发布于 2016/04/05 09:51
字数 580
阅读 138
收藏 3

好久没写php了,突然做个实验,发现竟然没有日志,哎

<?php
defined('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;
    }

}
?>


© 著作权归作者所有

IamOkay

IamOkay

粉丝 204
博文 483
码字总数 403228
作品 0
海淀
程序员
私信 提问
开源数据中心资产管理系统openDCIM 源程序理解

未命名 基础类 数据库类:db.inc.php 主要功能:数据库配置,初始化连接$dbh;引入、初始化配置类$config 配置类:config.inc.php 主要类:配置 工具类:facilities.inc.php 主要功能:引入a...

hillsdong
2014/02/19
1K
4
InitPHP 框架发布 3.5 正式版

InitPHP 3.5 修复日志: InitPHP是一款轻量级的php开发框架,采用分层体系架构,适合大中型网站架构。提供丰富的library类库,以及简单 的框架扩展机制。InitPHP还提供详细的开发文档,可以让...

滔哥
2014/05/26
2.7K
33
InitPHP V3.8 版本发布,PHP 开发框架

InitPHP V3.8版本更新: 1. 优化日志,自定义日志错误级别常量 ERROR WARN DEBUG INFO。并且日志根据天来划分。 2. 新增框架Service的RPC的调用功能,使业务分割更加容易。 3. 解决框架coreI...

initphp
2014/11/25
1K
12
PHP开发框架--HerosPHP

HerosPHP是一个轻量级PHP web 程序开发框架。作者开发这个框架的初衷是想作为一个学习型的框架给那些想深入了解框架并想自己开发框架的phper借鉴用的,期初是为了面向中小型网站的 开发以提高...

阳建
2015/12/09
1K
2
ThinkPHP开发必备composer扩展包

本文假设读者有能力正常使用composer 环境隔离 dotenv 真实世界的开发往往是这样, 多个团队成员共同开发, 线上线下的代码通过版本控制系统保持一致.但你无法保证也没理由要求所有机器上的应用...

朱__朱
2015/09/14
3.7K
6

没有更多内容

加载失败,请刷新页面

加载更多

Spring Boot 2 实战:使用 Spring Boot Admin 监控你的应用

1. 前言 生产上对 Web 应用 的监控是十分必要的。我们可以近乎实时来对应用的健康、性能等其他指标进行监控来及时应对一些突发情况。避免一些故障的发生。对于 Spring Boot 应用来说我们可以...

码农小胖哥
今天
6
0
ZetCode 教程翻译计划正式启动 | ApacheCN

原文:ZetCode 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远。 ApacheCN 学习资源 贡献指南 本项目需要校对,欢迎大家提交 Pull Request。 ...

ApacheCN_飞龙
今天
4
0
CSS定位

CSS定位 relative相对定位 absolute绝对定位 fixed和sticky及zIndex relative相对定位 position特性:css position属性用于指定一个元素在文档中的定位方式。top、right、bottom、left属性则...

studywin
今天
7
0
从零基础到拿到网易Java实习offer,我做对了哪些事

作为一个非科班小白,我在读研期间基本是自学Java,从一开始几乎零基础,只有一点点数据结构和Java方面的基础,到最终获得网易游戏的Java实习offer,我大概用了半年左右的时间。本文将会讲到...

Java技术江湖
昨天
7
0
程序性能checklist

程序性能checklist

Moks角木
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部