日志管理系统的重要性---怼死你的客户

周末来加班 一早就遇见了客户的疯狂连击 ,具体问题就是  客户添加了一次考试 这场考试的及格线是80

那么问题来了 有两个用户 40多分就及格了

 

客户肯定是不懂数据库的   但是我们可以清楚的看到 这两个问题用户出现的问题在于 及格线pass字段为0 真特么二 ,怎么办找原因吧  ,还好有操作日志。

好吧 问题解决了 客户那边也有了交代  (直接截图扔他脸上 你自己设置的及格线 现在来问我??),那么今天的目的就是告诉大家操作日志的重要性,不但是为了怼客户,

接触过php框架的朋友们可能都知道,日志在项目中的重要作用了,他可以帮助我们定位错误的位置,让程序更友好(处理得当的话不会直接抛出一大堆只有程序猿才真正动的英文),调试的时候也会很方便,还可以记录一些重要的操作等等,总之一个完整的项目要是没了日志系统,就已经开发的路上布满了荆棘、坑洼,肯定会磕磕绊绊的。

此文作者的日志是单一日志,加数学序号扩展。

我现在用的是日期日志,应用功能环境不一样,实现的东西有些不同。。

废话不多说了,附上日志类库的源代码:

/** 
 * 日志处理类 
 *  
 * @since alpha 0.0.1 
 * @date 2014.03.04 
 * @author genialx 
 *  
 */  
   
class Log{  
       
    //单例模式  
    private static $instance    = NULL;  
    //文件句柄  
    private static $handle      = NULL;  
    //日志开关  
    private $log_switch     = NULL;  
    //日志相对目录  
    private $log_file_path      = NULL;  
    //日志文件最大长度,超出长度重新建立文件  
    private $log_max_len        = NULL;  
    //日志文件前缀,入 log_0  
    private $log_file_pre       = 'log_';  
   
           
    /** 
     * 构造函数 
     *  
     * @since alpha 0.0.1 
     * @date 2014.02.04 
     * @author genialx 
     */  
    protected function __construct(){//注意:以下是配置文件中的常量,请读者自行更改  
           
        $this->log_file_path     = LOG_FILE_PATH;  
           
        $this->log_switch     = LOG_SWITCH;    
       
        $this->log_max_len    = LOG_MAX_LEN;  
       
    }  
       
    /** 
     * 单利模式 
     *  
     * @since alpha 0.0.1 
     * @date 2014.02.04 
     * @author genialx 
     */  
    public static function get_instance(){  
        if(!self::$instance instanceof self){  
            self::$instance = new self;  
        }  
        return self::$instance;  
    }  
       
    /** 
     *  
     * 日志记录 
     *  
     * @param int $type  0 -> 记录(THING LOG) / 1 -> 错误(ERROR LOG) 
     * @param string $desc 
     * @param string $time 
     *  
     * @since alpha 0.0.1 
     * @date 2014.02.04 
     * @author genialx 
     *  
     */  
    public function log($type,$desc,$time){  
        if($this->log_switch){  
               
            if(self::$handle == NULL){  
                $filename = $this->log_file_pre . $this->get_max_log_file_suf();  
                self::$handle = fopen($this->log_file_path . $filename, 'a');  
            }  
            switch($type){  
                case 0:  
                    fwrite(self::$handle, 'THING LOG:' . ' ' . $desc . ' ' . $time . chr(13));  
                    break;  
                case 1:  
                    fwrite(self::$handle, 'ERROR LOG:' . ' ' . $desc . ' ' . $time . chr(13));  
                    break;  
                default:  
                    fwrite(self::$handle, 'THING LOG:' . ' ' . $desc . ' ' . $time . chr(13));  
                    break;  
            }  
               
        }  
    }  
       
    /** 
     * 获取当前日志的最新文档的后缀 
     *  
     * @since alpha 0.0.1 
     * @date 2014.02.04 
     * @author genialx 
     */  
    private function get_max_log_file_suf(){  
        $log_file_suf = null;  
        if(is_dir($this->log_file_path)){  
            if($dh = opendir($this->log_file_path)){  
                while(($file = readdir($dh)) != FALSE){  
                    if($file != '.' && $file != '..'){  
                        if(filetype( $this->log_file_path . $file) == 'file'){  
                            $rs = split('_', $file);  
                            if($log_file_suf < $rs[1]){  
                                $log_file_suf = $rs[1];  
                            }  
                        }  
                    }  
                }  
                   
                if($log_file_suf == NULL){  
                    $log_file_suf = 0;  
                }  
                //截断文件  
                if( file_exists($this->log_file_path . $this->log_file_pre . $log_file_suf) && filesize($this->log_file_path . $this->log_file_pre . $log_file_suf) >= $this->log_max_len){  
                    $log_file_suf = intval($log_file_suf) + 1;  
                }  
                   
                return $log_file_suf;  
            }     
        }  
           
        return 0;  
           
    }  
       
    /** 
     * 关闭文件句柄 
     *  
     * @since alpha 0.0.1 
     * @date 2014.02.04 
     * @author genialx 
     */  
    public function close(){  
        fclose(self::$handle);  
    }  
}   

功能说明:

该日志类利用单例模式,节省资源。自行判断文件大小,超出指定大小则按序自行创建文件。如:文件log_0大于指定大小,则重新创建log_1文件(注意:创建文件是安装文件名后缀的数字的,请勿随意更改日志文件名)。
有待优化:

没有指定文件的最大个数,所以定期要手动删除过多的日志文件。

posted @ 2018-07-28 11:58  臭虫编写工程师小于  阅读(296)  评论(0编辑  收藏  举报