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 相关文章推荐
Excel数据导入Mysql数据库的实现代码
Jun 05 PHP
php 正则匹配函数体
Aug 25 PHP
PHP中10个不常见却非常有用的函数
Mar 21 PHP
PHP面向对象概念
Nov 06 PHP
php中使用addslashes函数报错问题的解决方法
Feb 06 PHP
解析php mysql 事务处理回滚操作(附实例)
Aug 05 PHP
ThinkPHP利用PHPMailer实现邮件发送实现代码
Sep 26 PHP
header导出Excel应用示例
Jan 24 PHP
PHP内存缓存Memcached类实例
Dec 08 PHP
php数组冒泡排序算法实例
May 06 PHP
PHP实现对xml进行简单的增删改查(CRUD)操作示例
May 19 PHP
php图片裁剪函数
Oct 31 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利用iframe实现无刷新文件上传功能的代码
2011/09/29 PHP
PHP统计nginx访问日志中的搜索引擎抓取404链接页面路径
2014/06/30 PHP
php中序列化与反序列化详解
2017/02/13 PHP
php中字符串和整数比较的操作方法
2019/06/06 PHP
实例讲解PHP表单
2020/06/10 PHP
javascript 跨浏览器开发经验总结(五) js 事件
2010/05/19 Javascript
input按钮的事件处理大全
2010/12/10 Javascript
合并table相同单元格的jquery插件分享(很精简)
2011/06/20 Javascript
JS读取cookies信息(记录用户名)
2012/01/10 Javascript
javascript删除一个html元素节点的方法
2014/12/20 Javascript
Nodejs关于gzip/deflate压缩详解
2015/03/04 NodeJs
JQuery中层次选择器用法实例详解
2015/05/18 Javascript
javascript简单实现类似QQ头像弹出效果的方法
2015/08/03 Javascript
解决bootstrap导航栏navbar在IE8上存在缺陷的方法
2016/07/01 Javascript
JS组件系列之Gojs组件 前端图形化插件之利器
2017/11/29 Javascript
angularjs中$http异步上传Excel文件方法
2018/02/23 Javascript
vue 的点击事件获取当前点击的元素方法
2018/09/15 Javascript
layui layer select 选择被遮挡的解决方法
2019/09/21 Javascript
[10:05]DOTA2-DPC中国联赛 正赛 iG vs PSG.LGD 选手采访
2021/03/11 DOTA
Python: 传递列表副本方式
2019/12/19 Python
Python ATM功能实现代码实例
2020/03/19 Python
matplotlib基础绘图命令之errorbar的使用
2020/08/13 Python
python如何实现word批量转HTML
2020/09/30 Python
CSS3属性 line-clamp控制文本行数的使用
2020/03/19 HTML / CSS
HTML5 解析规则分析
2009/08/14 HTML / CSS
多视角3D逼真HTML5水波动画
2016/03/03 HTML / CSS
JAVA程序设计笔试题面试题一套
2015/07/28 面试题
物业管理大学生个人的自我评价
2013/10/10 职场文书
饭店工作计划书
2014/01/10 职场文书
理工大学毕业生自荐信范文
2014/02/22 职场文书
毕业生个人求职自荐信
2014/02/26 职场文书
公益广告语集锦
2014/03/13 职场文书
母亲节感恩活动记录
2014/03/16 职场文书
工地安全质量标语
2014/06/07 职场文书
启动仪式策划方案
2014/06/14 职场文书
关于python pygame游戏进行声音添加的技巧
2021/10/24 Python