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网站安装程序制作的原理、步骤、注意事项和示例代码
Aug 01 PHP
openPNE常用方法分享
Nov 29 PHP
PHP中return 和 exit 、break和contiue 区别与用法
Apr 09 PHP
PHP中空字符串介绍0、null、empty和false之间的关系
Sep 25 PHP
php抓取页面的几种方法详解
Jun 17 PHP
PHP中new static()与new self()的区别异同分析
Aug 22 PHP
php基础教程
Aug 26 PHP
PHP使用PDO操作数据库的乱码问题解决方法
Apr 08 PHP
yii2高级应用之自定义组件实现全局使用图片上传功能的方法
Oct 08 PHP
原生JS实现Ajax通过POST方式与PHP进行交互的方法示例
May 12 PHP
php实现数字补零的方法总结
Sep 12 PHP
php使用redis的有序集合zset实现延迟队列应用示例
Feb 20 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 __autoload函数(自动载入类文件)的使用方法
2012/02/04 PHP
PHP实现抓取HTTPS内容
2014/12/01 PHP
THINKPHP支持YAML配置文件的设置方法
2015/03/17 PHP
PHP7.1方括号数组符号多值复制及指定键值赋值用法分析
2016/09/26 PHP
php判断数组是否为空的实例方法
2020/05/10 PHP
ejs v9 javascript模板系统
2012/03/21 Javascript
javascript中with()方法的语法格式及使用
2014/08/04 Javascript
nodejs教程之制作一个简单的文章发布系统
2014/11/21 NodeJs
jquery实现炫酷的叠加层自动切换特效
2015/02/01 Javascript
Jquery中的$.each获取各种返回类型数据的使用方法
2015/05/03 Javascript
JavaScript截断字符串的方法
2015/07/15 Javascript
微信小程序 数据访问实例详解
2016/10/08 Javascript
javascript中href和replace的比较(详解)
2016/11/25 Javascript
Angular获取手机验证码实现移动端登录注册功能
2017/05/17 Javascript
三分钟学会用ES7中的Async/Await进行异步编程
2018/06/14 Javascript
浅谈在react中如何实现扫码枪输入
2018/07/04 Javascript
js实现京东秒杀倒计时功能
2019/01/21 Javascript
JavaScript回调函数callback用法解析
2020/01/14 Javascript
Vue数字输入框组件使用方法详解
2020/02/10 Javascript
带你使用webpack快速构建web项目的方法
2020/11/12 Javascript
[01:18:43]2014 DOTA2华西杯精英邀请赛5 24 iG VS DK
2014/05/25 DOTA
Python实现的数据结构与算法之双端队列详解
2015/04/22 Python
用 Python 连接 MySQL 的几种方式详解
2018/04/04 Python
Python生成短uuid的方法实例详解
2018/05/29 Python
Python制作词云图代码实例
2019/09/09 Python
python栈的基本定义与使用方法示例【初始化、赋值、入栈、出栈等】
2019/10/24 Python
Python SMTP发送电子邮件的示例
2020/09/23 Python
css3边框_动力节点Java学院整理
2017/07/11 HTML / CSS
软件工程专业推荐信
2013/10/28 职场文书
经典洗发水广告词
2014/03/13 职场文书
师德师风自我评价范文
2014/09/11 职场文书
党员群众路线教育实践活动剖析材料
2014/10/10 职场文书
依法行政工作汇报
2014/10/28 职场文书
2015年全民创业工作总结
2015/07/23 职场文书
幼儿园毕业致辞
2015/07/29 职场文书
Python的代理类实现,控制访问和修改属性的权限你都了解吗
2022/03/21 Python