php利用单例模式实现日志处理类库

对于现在的应用程序来说,日志的重要性是不言而喻的。很难想象没有任何日志记录功能的应用程序运行在生产环境中。日志所能提供的功能是多种多样的,包括记录程序运行时产生的错误信息、状态信息、调试信息和执行时间信息等。在生产环境中,日志是查找问题来源的重要依据。应用程序运行时的产生的各种信息,都应该通过日志类库来进行记录。

代码如下:

/**
 * 日志处理类
 *
 * @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();

(0)

相关推荐

  • 解析php如何将日志写进syslog

    在做项目的时候们为了方便运维,我们经常需要将系统日志写入系统syslog,下边我们就介绍一下,在linux下php对syslog的操作:在linux中配置syslog在linux中,facility(设备)有以下几种:AUTH 普通安全/授权消息AUTHPRIV 私有安全/授权消息CRON 定时器进程DAEMON 守护进程KERN 内核消息LOCAL0 ... LOCAL7  本地应用,在windows上不支持LPR  行式打印机MAIL  邮件服务NEWS  新闻服务SYSLOG  由sysl

  • php实现的简单日志写入函数

    本文实例讲述了php实现的简单日志写入函数.分享给大家供大家参考.具体实现方法如下: function log( $logthis ){ file_put_contents('logfile.log', date("Y-m-d H:i:s"). " " . $logthis. "\r\n", FILE_APPEND | LOCK_EX); } // use \r\n for new line on windows, just \n on linu

  • php性能分析之php-fpm慢执行日志slow log用法浅析

    本文实例讲述了php性能分析之php-fpm慢执行日志slow log用法.分享给大家供大家参考,具体如下: 众所周知,mysql有slow query log,根据慢查询日志,我们可以知道那些sql语句有性能问题.作为mysql的好搭档,php也有这样的功能.如果你使用php-fpm来管理php的话,你可以通过如下选项开启. PHP 5.3.3 之前设置如下: <value name="request_slowlog_timeout">5s</value> &

  • php实现的debug log日志操作类实例

    本文实例讲述了php实现的debug log日志操作类.分享给大家供大家参考,具体如下: <?php class Tool { public static function log($info) { $time = date('m-d H:i:s'); $backtrace = debug_backtrace(); $backtrace_line = array_shift($backtrace); // 哪一行调用的log方法 $backtrace_call = array_shift($ba

  • PHP 写文本日志实现代码

    复制代码 代码如下: ** * 写文件 * @param string $file 文件路径 * @param string $str 写入内容 * @param char $mode 写入模式 */ function writeFile($file,$str,$mode='w') { $oldmask = @umask(0); $fp = @fopen($file,$mode); @flock($fp, 3); if(!$fp) { Return false; } else { @fwrite

  • PHP写日志的实现方法

    本文实例讲述了PHP写日志的实现方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: function logError($content)  {    $logfile = '/logs/debuglog'.date('Ymd').'.txt';    if(!file_exists(dirname($logfile)))    {      @File_Util::mkdirr(dirname($logfile));    }    error_log(date("[Y-m-

  • php错误日志简单配置方法

    本文实例讲述了php配置错误日志的方法.分享给大家供大家参考,具体如下: php.ini: ; 错误日志 log_errors = On ; 显示错误 display_errors = Off ; 日志路径 error_log = "/usr/local/lnmp/php/var/log/error_log" ; 错误等级 error_reporting = E_ALL&~E_NOTICE php-fpm.conf: [global] ; php-fpm pid文件 pid =

  • php记录日志的实现代码

    复制代码 代码如下: $ss_log_level = 0; $ss_log_filename = /tmp/ss-log; $ss_log_levels = array( NONE => 0, ERROR => 1, INFO => 2, DEBUG => 3 ); //设置日志级别 function ss_log_set_level ($level = ERROR) { global $ss_log_level; $ss_log_level = $level; } //记录日志

  • php基于自定义函数记录log日志方法

    本文实例讲述了php基于自定义函数记录log日志方法.分享给大家供大家参考,具体如下: /** * 记录错误日志 * @param 日志内容 $res */ function save_log($res) { $err_date = date("Ym", time()); //$address = '/var/log/error'; $address = './error'; if (!is_dir($address)) { mkdir($address, 0700, true); }

  • PHP调试函数和日志记录函数分享

    网站程序开发过程经常需要调试,发布阶段也需要记录运行日志,方便发现问题和还原事件.这就要求有调试和日志记录功能. 下面分别写了用于调试的函数和用于记录错误的函数. 使用方法很简单,且自动根据日期生成日志文件: 复制代码 代码如下: //调试时,多个参数都可以: sysdebug("hello"); sysdebug("hello", "tiger is coming now"); //错误记录也一样: syserror("error&q

  • 记录PHP错误日志 display_errors与log_errors的区别

    display_errors 错误回显,一般常用语开发模式,但是很多应用在正式环境中也忘记了关闭此选项.错误回显可以暴露出非常多的敏感信息,为攻击者下一步攻击提供便利.推荐关闭此选项. display_errors = On 开启状态下,若出现错误,则报错,出现错误提示 dispaly_errors = Off 关闭状态下,若出现错误,则提示:服务器错误.但是不会出现错误提示 log_errors 在正式环境下用这个就行了,把错误信息记录在日志里.正好可以关闭错误回显. 对于PHP开发人员来说,

随机推荐