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 相关文章推荐
GD输出汉字的函数的分析
Oct 09 PHP
介绍php设计模式中的工厂模式
Jun 12 PHP
深入理解PHP原理之异常机制
Aug 21 PHP
JS异常处理try..catch语句的作用和实例
May 05 PHP
php写的AES加密解密类分享
Jun 20 PHP
新浪微博OAuth认证和储存的主要过程详解
Mar 27 PHP
php实现随机生成易于记忆的密码
Jun 19 PHP
利用php的ob缓存机制实现页面静态化方法
Jul 09 PHP
PHP实现重载的常用方法实例详解
Oct 18 PHP
PHP登录验证功能示例【用户名、密码、验证码、数据库、已登陆验证、自动登录和注销登录等】
Feb 25 PHP
使用composer命令加载vendor中的第三方类库 的方法
Jul 09 PHP
CentOS7系统搭建LAMP及更新PHP版本操作详解
Mar 26 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 用sock技术发送邮件的函数
2007/07/21 PHP
56.com视频采集接口程序(PHP)
2007/09/22 PHP
php使用Jpgraph绘制简单X-Y坐标图的方法
2015/06/10 PHP
zen_cart实现支付前生成订单的方法
2016/05/06 PHP
Yii CFileCache 获取不到值的原因分析
2017/02/08 PHP
php获取今日开始时间和结束时间的方法
2017/02/27 PHP
thinkPHP5框架闭包函数与子查询传参用法示例
2018/08/02 PHP
PHP hex2bin()函数用法讲解
2019/02/25 PHP
JS操作Cookies包括(读取添加与删除)
2012/12/26 Javascript
script的async属性以非阻塞的模式加载脚本
2013/01/15 Javascript
javascript判断非数字的简单例子
2013/07/18 Javascript
js中数组(Array)的排序(sort)注意事项说明
2014/01/24 Javascript
jQuery实现级联菜单效果(仿淘宝首页菜单动画)
2014/04/10 Javascript
node.js中的path.isAbsolute方法使用说明
2014/12/08 Javascript
Three.js基础部分学习
2017/01/08 Javascript
详解网站中图片日常使用以及优化手法
2017/01/09 Javascript
JS中如何实现点击a标签返回页面顶部的问题
2017/01/19 Javascript
vue2 自定义动态组件所遇到的问题
2017/06/08 Javascript
基于Vue单文件组件详解
2017/09/15 Javascript
jquery ajaxfileuplod 上传文件 essyui laoding 效果【防止重复上传文件】
2018/05/26 jQuery
JavaScript实现点击自制菜单效果
2021/02/02 Javascript
Python实现的Kmeans++算法实例
2014/04/26 Python
PyQt5 closeEvent关闭事件退出提示框原理解析
2020/01/08 Python
python输出pdf文档的实例
2020/02/13 Python
浅谈多卡服务器下隐藏部分 GPU 和 TensorFlow 的显存使用设置
2020/06/30 Python
python抢购软件/插件/脚本附完整源码
2021/03/04 Python
纯CSS3实现绘制各种图形实现代码详细整理
2012/12/26 HTML / CSS
迪卡侬印尼体育用品商店:Decathlon印尼
2020/03/11 全球购物
国家励志奖学金获奖感言
2014/01/09 职场文书
初中地理教学反思
2014/01/11 职场文书
大学生在校学习的自我评价
2014/02/18 职场文书
校园文明标语
2014/06/13 职场文书
社区班子个人对照检查材料思想汇报
2014/10/07 职场文书
电子商务专业求职信范文
2015/03/19 职场文书
法律意见书范文
2015/06/04 职场文书
安全生产会议制度
2015/08/06 职场文书