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将时间差转换为字符串提示
Sep 07 PHP
php中操作memcached缓存进行增删改查数据的实现代码
Aug 15 PHP
php实现阿拉伯数字和罗马数字相互转换的方法
Apr 17 PHP
php数组比较实现查找连续数的方法
Jul 29 PHP
修复ShopNC使用QQ 互联时提示100010 错误
Nov 08 PHP
ZF框架实现发送邮件的方法
Dec 03 PHP
golang与php实现计算两个经纬度之间距离的方法
Jul 22 PHP
php分页原理 分页代码 分页类制作教程
Sep 23 PHP
PHP批量删除jQuery操作
Jul 23 PHP
基于win2003虚拟机中apache服务器的访问
Aug 01 PHP
php利用云片网实现短信验证码功能的示例代码
Nov 18 PHP
Yii框架应用组件用法实例分析
May 15 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
Excel数据导入Mysql数据库的实现代码
2008/06/05 PHP
php单例模式实现(对象只被创建一次)
2012/12/05 PHP
php jq jquery getJSON跨域提交数据完整版
2013/09/13 PHP
PHP的PSR规范中文版
2013/09/28 PHP
PHP+FFMPEG实现将视频自动转码成H264标准Mp4文件
2014/09/24 PHP
PHP中error_reporting函数用法详细介绍
2017/06/11 PHP
详解no input file specified 三种解决方法
2019/11/29 PHP
document.getElementById为空或不是对象的解决方法
2010/01/24 Javascript
基于Jquery的文字自动截取(提供源代码)
2011/08/09 Javascript
javascript检查表单数据是否改变的方法
2013/07/30 Javascript
js中split函数的使用方法说明
2013/12/26 Javascript
jquery 表单验证之通过 class验证表单不为空
2015/11/02 Javascript
AngularJS基础 ng-click 指令示例代码
2016/08/01 Javascript
js原生跨域_用script标签的简单实现
2016/09/24 Javascript
微信小程序 解决swiper不显示图片的方法
2017/01/04 Javascript
vue2.0开发入门笔记之.vue文件的生成和使用
2017/09/19 Javascript
Vuejs 单文件组件实例详解
2018/02/09 Javascript
vue 实现特定条件下绑定事件
2019/11/09 Javascript
JavaScript实现网页下拉菜单效果
2020/11/20 Javascript
Python3.5常见内置方法参数用法实例详解
2019/04/29 Python
关于win10在tensorflow的安装及在pycharm中运行步骤详解
2020/03/16 Python
python 画条形图(柱状图)实例
2020/04/24 Python
python+requests接口自动化框架的实现
2020/08/31 Python
CSS3 Flex 弹性布局实例代码详解
2018/11/01 HTML / CSS
HTML5视频支持检测(检查浏览器是否支持视频播放)
2013/06/08 HTML / CSS
用HTML5 实现橡皮擦的涂抹效果的教程
2015/05/11 HTML / CSS
Ralph Lauren法国官网:美国高品味时装品牌
2017/12/08 全球购物
Wiggle美国:英国骑行、跑步、游泳、铁人三项商店
2018/10/27 全球购物
linux面试题参考答案(8)
2016/04/19 面试题
统计系教授推荐信
2014/02/28 职场文书
对祖国的寄语大全
2014/04/11 职场文书
星级党支部申报材料
2014/05/31 职场文书
工程负责人任命书
2014/06/06 职场文书
企业与个人合作经营协议书
2014/11/01 职场文书
2016年大学生社会实践心得体会
2015/10/09 职场文书
Mysql 如何查询时间段交集
2021/06/08 MySQL