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


    周末来加班 一早就遇见了客户的疯狂连击 ,具体问题就是  客户添加了一次考试 这场考试的及格线是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文件(注意:创建文件是安装文件名后缀的数字的,请勿随意更改日志文件名)。
    有待优化:

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

  • 相关阅读:
    Java实现 蓝桥杯VIP 算法训练 字符删除
    Java实现 蓝桥杯VIP 算法训练 字符删除
    Java实现 蓝桥杯VIP 算法训练 字符删除
    Java实现 蓝桥杯VIP 算法训练 字符删除
    Java实现 蓝桥杯VIP 算法训练 字符删除
    Java实现 蓝桥杯VIP 算法训练 字符串编辑
    Java实现 蓝桥杯VIP 算法训练 字符串编辑
    Java实现 蓝桥杯VIP 算法训练 字符串编辑
    Java实现 蓝桥杯VIP 算法训练 字符串编辑
    Java实现 蓝桥杯VIP 算法训练 字符串编辑
  • 原文地址:https://www.cnblogs.com/yumingzhao/p/9381479.html
Copyright © 2020-2023  润新知