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 相关文章推荐
聊天室php&amp;mysql(五)
Oct 09 PHP
《PHP编程最快明白》第八讲:php启发和小结
Nov 01 PHP
第4章 数据处理-php字符串的处理-郑阿奇(续)
Jul 04 PHP
phpmailer发送gmail邮件实例详解
Jun 24 PHP
通过table标签,PHP输出EXCEL的实现方法
Jul 24 PHP
mac下多个php版本快速切换的方法
Oct 09 PHP
php中让人头疼的浮点数运算分析
Oct 10 PHP
yii使用bootstrap分页样式的实例
Jan 17 PHP
Yii2选项卡的简单使用
May 26 PHP
PHP实现将优酷土豆腾讯视频html地址转换成flash swf地址的方法
Aug 04 PHP
php 命名空间(namespace)原理与用法实例小结
Nov 13 PHP
七种PHP开发环境搭建工具
Jun 28 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把session写入数据库示例
2014/02/26 PHP
PHP也能干大事 随机函数
2015/04/14 PHP
PHP简单生成缩略图相册的方法
2015/07/29 PHP
php如何控制用户对图片的访问 PHP禁止图片盗链
2016/03/25 PHP
ThinkPHP 整合Bootstrap Ajax分页样式
2016/12/23 PHP
新页面打开实际尺寸的图片
2006/08/25 Javascript
Jquery Ajax的Get方式时需要注意URL地方
2011/04/07 Javascript
JavaScript模拟深蓝vs卡斯帕罗夫的国际象棋对局示例
2015/04/22 Javascript
Jquery中request和request.form和request.querystring的区别
2015/11/26 Javascript
Javascript页面跳转常见实现方式汇总
2015/11/28 Javascript
JavaScript基本类型值-Undefined、Null、Boolean
2017/02/23 Javascript
JavaScript中object和Object的区别(详解)
2017/02/27 Javascript
vue.js动态数据绑定学习笔记
2017/05/19 Javascript
使用JavaScript根据图片获取条形码的方法
2017/07/04 Javascript
knockoutjs模板实现树形结构列表
2017/07/31 Javascript
iView-admin 动态路由问题的解决方法
2018/10/03 Javascript
Vue 之孙组件向爷组件通信的实现
2019/04/23 Javascript
turn.js异步加载实现翻书效果
2019/07/25 Javascript
基于vue手写tree插件的那点事儿
2019/08/20 Javascript
vue项目配置同一局域网可使用ip访问的操作
2020/10/23 Javascript
在Python中通过threading模块定义和调用线程的方法
2016/07/12 Python
Python中对象的引用与复制代码示例
2017/12/04 Python
Python实现的随机森林算法与简单总结
2018/01/30 Python
Python3.6.0+opencv3.3.0人脸检测示例
2018/05/25 Python
python 实现UTC时间加减的方法
2018/12/31 Python
Python XlsxWriter模块Chart类用法实例分析
2019/03/11 Python
Python 日期的转换及计算的具体使用详解
2020/01/16 Python
在Tensorflow中实现梯度下降法更新参数值
2020/01/23 Python
大都会艺术博物馆商店:The Met Store
2018/06/22 全球购物
暑假实习求职信范文
2013/09/22 职场文书
党员创先争优活动总结
2014/05/04 职场文书
勤奋学习演讲稿
2014/05/10 职场文书
2014年个人工作总结范文
2014/11/07 职场文书
获奖感言范文
2015/07/31 职场文书
军事理论课感想
2015/08/11 职场文书
《青山不老》教学反思
2016/02/22 职场文书