php利用单例模式实现日志处理类库


Posted in PHP onFebruary 10, 2014

对于现在的应用程序来说,日志的重要性是不言而喻的。很难想象没有任何日志记录功能的应用程序运行在生产环境中。日志所能提供的功能是多种多样的,包括记录程序运行时产生的错误信息、状态信息、调试信息和执行时间信息等。在生产环境中,日志是查找问题来源的重要依据。应用程序运行时的产生的各种信息,都应该通过日志类库来进行记录。

/**
 * 日志处理类
 * 
 * @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文件(注意:创建文件是安装文件名后缀的数字的,请勿随意更改日志文件名)。

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

调用示例:

//LOG
$L = Log::get_instance();
//第一个参数 int 0代表事件记录(THING LOG:),1代表错误记录(ERROR LOG:)
//第二个参数 string 描述文字
//第三个参数 string 时间
$L->log(1,'日志描述', date('Y-n-j H:m:s'));
$L->close();
PHP 相关文章推荐
我的论坛源代码(一)
Oct 09 PHP
简单介绍下 PHP5 中引入的 MYSQLI的用途
Mar 19 PHP
php Http_Template_IT类库进行模板替换
Mar 19 PHP
PHP UTF8中文字符截断函数代码
Sep 11 PHP
PHP依赖倒置(Dependency Injection)代码实例
Oct 11 PHP
php+xml实现在线英文词典查询的方法
Jan 23 PHP
php实现的mongodb操作类
May 28 PHP
修复ShopNC使用QQ 互联时提示100010 错误
Nov 08 PHP
linux下php上传文件注意事项
Jun 11 PHP
PHP十六进制颜色随机生成器功能示例
Jul 24 PHP
PHP结合Ffmpeg快速搭建流媒体服务的实践记录
Oct 31 PHP
TP5.0框架实现无限极回复功能的方法分析
May 04 PHP
PHP遍历并打印指定目录下所有文件实例
Feb 10 #PHP
php生成excel文件的简单方法
Feb 08 #PHP
php中利用explode函数分割字符串到数组
Feb 08 #PHP
PHP判断变量是否为0的方法
Feb 08 #PHP
php读取文件内容的三种可行方法示例介绍
Feb 08 #PHP
php中\r \r\n \t的区别示例介绍
Feb 08 #PHP
php获得用户ip地址的比较不错的方法
Feb 08 #PHP
You might like
PHP 超链接 抓取实现代码
2009/06/29 PHP
JavaScript 创建对象和构造类实现代码
2009/07/30 Javascript
Struts2的s:radio标签使用及用jquery添加change事件
2013/04/08 Javascript
Jquery中val()表单取值赋值的实例代码
2013/08/15 Javascript
Jquery 数组操作大全个人总结
2013/11/13 Javascript
什么是cookie?js手动创建和存储cookie
2014/05/27 Javascript
js动态修改表格行colspan列跨度的方法
2015/03/30 Javascript
常用DOM整理
2015/06/16 Javascript
理解javascript中Map代替循环
2016/02/26 Javascript
神奇!js+CSS+DIV实现文字颜色渐变效果
2016/03/16 Javascript
vue组件(全局,局部,动态加载组件)
2018/09/02 Javascript
Vuejs开发环境搭建及热更新【推荐】
2018/09/07 Javascript
vue-cli项目中使用echarts图表实例
2018/10/22 Javascript
详解一个小实例理解js原型和继承
2019/04/24 Javascript
vue中动态select的使用方法示例
2019/10/28 Javascript
Javascript原型链及instanceof原理详解
2020/05/25 Javascript
[06:40]2014DOTA2西雅图国际邀请赛 DK战队巡礼
2014/07/07 DOTA
[20:46]Ti4循环赛第三日VG vs DK
2014/07/12 DOTA
Python 绘图库 Matplotlib 入门教程
2018/04/19 Python
python实现批量修改图片格式和尺寸
2018/06/07 Python
python logging重复记录日志问题的解决方法
2018/07/12 Python
Tensorflow实现酸奶销量预测分析
2019/07/19 Python
Python Process多进程实现过程
2019/10/22 Python
HTML5 video播放器全屏(fullScreen)方法实例
2015/04/24 HTML / CSS
英国广泛的照明产品网站:Lights4living
2018/01/28 全球购物
施华洛世奇美国官网:SWAROVSKI美国
2018/02/08 全球购物
Jacadi Paris英国官网:法国童装品牌
2019/08/09 全球购物
幼儿教育感言
2014/02/05 职场文书
上班玩游戏检讨书
2014/02/07 职场文书
网络编辑岗位职责
2014/03/18 职场文书
班主任经验交流会主持词
2014/04/01 职场文书
小学社团活动总结
2014/06/27 职场文书
八达岭长城导游词
2015/01/30 职场文书
乌镇导游词
2015/02/02 职场文书
党员干部廉洁自律承诺书
2015/04/28 职场文书
聋哑人盗窃罪辩护词
2015/05/21 职场文书