封装一个面向对象的日志操作类

一、代码:

主要用到了PHP原生的filesystem模块提供的一些函数来读写日志文件,

/**
 * mylog抽象日志对象
 */
class myLog
{
    /**
     * @var logpath string 日志文件存放的目录
     */
    private $logpath;

    /*
     * @var file_handler resource 日志文件读写操作句柄
     */
    private $file_handler;

    /**
     * 初始化对象,设置日志目录为默认目录,打开文件句柄
     */
    function __construct()
    {
        //设置日志目录为默认目录
        $this->logpath = dirname(__FILE__).'/../logs/';
        $filename = $this->logpath . $this->_get_current_date() . '.log';
        //打开文件句柄
        $this->file_handler = fopen($filename, 'a+');
        return true;
    }

    /**
     * 销毁文件句柄后销毁对象
     */
    function __destruct()
    {
        if ( $this->file_handler=='NULL' ) {
            return true;
        }

        fclose($this->file_handler);
        return true;
    }

    /**
     * 以时分秒格式获取当前时间
     * @return string 详细时间
     */
    private function _get_current_time()
    {
        $time=date("H:m:i", time());
        return $time;
    }

    /**
     * 以年月日格式获取当前系统时间
     * @return string 粗略时间
     */
    private function _get_current_date()
    {
        $time=date("Y-m-d", time());
        return $time;
    }

    /**
     * 获取访问者IP地址
     * @return string 访问者IP地址
     */
    private function _get_client_ip()
    {
        $ip=getenv("REMOTE_ADDR");
        $ip= $ip=='::1' ? '127.0.0.1' : $ip;
        return $ip;

    }

    /**
     * 获取访问者使用的浏览器类型
     * @return string 浏览器描述详细信息
     */
    private function _get_client_browser()
    {
        $browser = getenv("HTTP_USER_AGENT");
        return $browser;
    }

    /**
     * 以特定格式将传入的字符串格式化
     * @param  string $content 要写入日志的信息
     * @param  string $level   日志记录级别
     * @return string          格式化后的字符串
     */
    private function _format_row_record($content='NULL', $level='info')
    {
        $time = $this->_get_current_time();
        $browser = $this->_get_client_browser();
        $divider = ' | ';
        $client_ip = $this->_get_client_ip();
        $row = $time . $divider . $level . $divider . $client_ip . $divider . $content . $divider . $browser . "\r\n";
        return $row;
    }

    /**
     * 设置日志存放的目录
     * @param string $dir 日志存放的目录
     */
    public function set_log_dir($dir)
    {
        if ( !isset($dir) )
        {
            echo "设置日志目录失败!";
            return false;
        }

        if ( !file_exists($dir) ) 
        {
            echo "指定的日志目录不存在!";
            return false;
        }

        //如果参数字符串不是以'\'结尾,则添加'\'
        if ( preg_match('/^.*[^\/]$/', $dir) ) 
        {
            $dir=$dir.'/';
        }

        $this->logpath=$dir;

        //关闭旧句柄,打开新操作句柄
        fclose($this->file_handler);
        $filename = $this->logpath . $this->_get_current_date() . '.log';
        $this->file_handler = fopen($filename, 'a+');

        return true;
    }

    /**
     * 记录一条日志信息
     * @param  string $content 要记录的信息
     * @param  string $level   要记录的日志级别
     * @return boolean
     */
    public function record($content='NULL', $level='info')
    {
        $row_str = $this->_format_row_record($content, $level);
        fwrite($this->file_handler, $row_str);
        return true;
    }

    /**
     * 记录一条info级别的日志信息
     * @param  string $content 要记录的信息
     * @return boolean
     */
    public function info($content='NULL')
    {
        $level='info';
        $row_str = $this->_format_row_record($content, $level);
        fwrite($this->file_handler, $row_str);
        return true;
    }

    /**
     * 记录一条error级别的日志信息
     * @param  string $content 要记录的信息
     * @return boolean
     */
    public function error($content='NULL')
    {
        $level='error';
        $row_str = $this->_format_row_record($content, $level);
        fwrite($this->file_handler, $row_str);
        return true;
    }

    /**
     * 记录一条success级别的日志信息
     * @param  string $content 要记录的信息
     * @return boolean
     */
    public function success($content='NULL')
    {
        $level='success';
        $row_str = $this->_format_row_record($content, $level);
        fwrite($this->file_handler, $row_str);
        return true;
    }
}

二、调用

//实例化
$log=new myLog;

//向默认目录写入一条指定等级为'level'的日志信息
$log->record('here is some info in default log dir', 'info');

//配置新的日志存储位置
$log->set_log_dir('./newlog/');

//写入一条新的信息
$log->record('here is some info in new log dir', 'info');

//直接写入错误信息
$log->error('request error!');

//直接写入成功信息
$log->success('OK!');