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 静态变量与自定义常量的使用方法
Jan 26 PHP
destoon实现会员商铺中指定会员或会员组投放广告的方法
Aug 21 PHP
Symfony2框架创建项目与模板设置实例详解
Mar 17 PHP
Yii数据库缓存实例分析
Mar 29 PHP
PHP6连接SQLServer2005的三部曲
Apr 15 PHP
php 指定范围内多个随机数代码实例
Jul 18 PHP
thinkPHP中配置的读取与C方法详解
Dec 05 PHP
PHP生成唯一ID之SnowFlake算法
Dec 17 PHP
THINKPHP3.2使用soap连接webservice的解决方法
Dec 13 PHP
laravel框架 api自定义全局异常处理方法
Oct 11 PHP
Laravel实现通过blade模板引擎渲染视图
Oct 25 PHP
如何在Mac上通过docker配置PHP开发环境
May 29 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实现获取文件后缀名的几种常用方法
2015/08/08 PHP
javascript prototype原型操作笔记
2009/12/07 Javascript
javascript getElementsByClassName 和js取地址栏参数
2010/01/02 Javascript
JS中toFixed()方法引起的问题如何解决
2012/11/20 Javascript
jquery 动态创建元素的方式介绍及应用
2013/04/21 Javascript
JavaScript基础篇之变量作用域、传值、传址的简单介绍与实例
2013/06/29 Javascript
jquery通过load获取文件的内容并跳到锚点的方法
2015/01/29 Javascript
JavaScript实现在标题栏上显示当前日期的方法
2015/03/19 Javascript
JavaScript中的setUTCDate()方法使用详解
2015/06/11 Javascript
javascript判断网页是关闭还是刷新
2015/09/12 Javascript
实例讲解javascript注册事件处理函数
2016/01/09 Javascript
使用BootStrap建立响应式网页——通栏轮播图(carousel)
2016/12/21 Javascript
JS简单判断滚动条的滚动方向实现方法
2017/04/28 Javascript
vue 全选与反选的实现方法(无Bug 新手看过来)
2018/02/09 Javascript
JS/HTML5游戏常用算法之路径搜索算法 A*寻路算法完整实例
2018/12/14 Javascript
jQuery zTree树插件的使用教程
2019/08/16 jQuery
vue服务端渲染操作简单入门实例分析
2019/08/28 Javascript
vue实现倒计时获取验证码效果
2020/04/17 Javascript
js中火星坐标、百度坐标、WGS84坐标转换实现方法示例
2020/03/02 Javascript
Python基于ThreadingTCPServer创建多线程代理的方法示例
2018/01/11 Python
python OpenCV学习笔记实现二维直方图
2018/02/08 Python
详解Python读取yaml文件多层菜单
2019/03/23 Python
解决Mac下使用python的坑
2019/08/13 Python
Python学习笔记之Break和Continue用法分析
2019/08/14 Python
python实现从wind导入数据
2019/12/03 Python
浅析Python 多行匹配模式
2020/07/24 Python
Trip.com香港网站:Ctrip携程旗下,全球最大的网上旅游社之一
2016/08/01 全球购物
美国主要的特色咖啡和茶公司:Peet’s Coffee
2020/02/14 全球购物
意大利领先的奢侈品在线时装零售商:MCLABELS
2020/10/13 全球购物
IMPORT的选项IGNORE有什么作用?缺省是什么设置?
2015/09/17 面试题
测试驱动开发的主要步骤是什么
2014/12/10 面试题
高中体育教学反思
2014/01/24 职场文书
小学先进集体事迹材料
2014/05/31 职场文书
创先争优活动承诺书
2014/08/30 职场文书
万能检讨书开头与结尾怎么写
2015/02/17 职场文书
2015年乡镇统计工作总结
2015/04/22 职场文书