zoukankan      html  css  js  c++  java
  • 日志管理系统的重要性---怼死你的客户

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

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

  • 相关阅读:
    上传图片并实现本地预览
    a标签传递参数
    HTTP错误 404.17–Not Found 请求的内容似乎是脚本,因而将无法有静态文件处理程序来处理
    VM虚拟机无法拖拽、粘贴、复制
    ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值
    Oracle中Clob类型处理解析:ORA-01461:仅可以插入LONG列的LONG值赋值
    Oracle获取表结构信息:表名、是否视图、字段名、类型、长度、非空、主键
    SQLServer2005,2000获取表结构:字段名、类型、长度、主键、非空、注释
    c# float和double的“坑”
    VS活动解决方案平台
  • 原文地址:https://www.cnblogs.com/yumingzhao/p/9381479.html
Copyright © 2011-2022 走看看