自定义Log日志类

405 查看

  • 为什么需要日志Log
    日志的功能:
    1.了解系统运行情况
    2.记录用户的操作信息(记录用户传递了什么参数等)
    3.收集数据(记录请求响应请求等)

  • PHP自带的日志系统
    php中有一个记录日志的函数:
    bool error_log ( string $message [, int $message_type = 0 [, string $destination [, string $extra_headers ]]] ):
    $message_type:记录日志的类型:
    0 :message 发送到 PHP 的系统日志,使用 操作系统的日志机制或者一个文件,取决于 error_log 指令设置了什么。 这是个默认的选项。
    1:message 发送到参数 destination 设置的邮件地址。 第四个参数 extra_headers 只有在这个类型里才会被用到。
    2:不再是一个选项。
    3:message 被发送到位置为 destination 的文件里。 字符 message 不会默认被当做新的一行。
    4:message 直接发送到 SAPI 的日志处理程序中。

  • 如何自定义自己的日志系统
    步骤如下:
    1.类自动加载类(Loader.php)
<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2016/3/27
 * Time: 14:15
 */

namespace IMooc;

class Loader
{
    static function autoload($class){
        require_once BASEDIR.'/'.str_replace('\\','/',$class).'.php';
    }

}

2.配置文件类(Config.php)

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2016/3/27
 * Time: 22:55
 */

namespace IMooc;

class Config implements \ArrayAccess
{
    protected $config = array();
    private $path;
    public function __construct($path){
        $this->path = $path;
    }
    public function offsetGet($key){
        if(empty($this->config[$key])){
            $file_path = $this->path.'/'.$key.'.php';
            $this->config[$key] = require $file_path;
            return $this->config[$key];
        }
    }
    public function offsetExists($key){}

    public function offsetSet($key, $value){
      throw new \Exception('config not found!');
    }
    public function offsetUnset($key){}
}

3.自定义日志类(Log.php)=>以天为记录单位

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2016/3/31
 * Time: 18:11
 */

namespace IMooc;

use \IMooc\Config;

class Log
{
    private static  $log_path ;

    /*
     * 构造log文件路径
     * @param $log_name string log路径别称
     * */
    public function __construct($log_name){
        self::setLog($log_name);
    }

    /*
     * 设置log的路径
     * @param $log_name string log路径别称
     * */
    private static  function setLog($log_name){
        //引入Logs配置文件
        $config = new Config(BASEDIR.'/Configs');
        if(empty($config['log'])){
            $cofigs = $config['log'];
            if(isset($cofigs[$log_name]))
                self::$log_path = $cofigs[$log_name];
            else
                self::$log_path = BASEDIR."/Logs/".date("Y-m-d").'/';
        }else{
            throw  new \Exception("Logs Dir is not exist !");
        }
    }

    /*
     * 将信息写入log文件中
     * @param $message mixture log信息
     * @param $log_name string log路径别称
     * */
    public static function log($message = "" ,$log_name = ""){
        if(!empty($log_name))
            self::setLog($log_name);
        $date = date("Y-m-d");
        $log_dir = self::$log_path;
        if(!is_dir($log_dir))
               mkdir($log_dir, 0777,true);

        $log_file_name = $log_dir.$date.'.log';

        if(!file_exists($log_file_name))
               touch($log_file_name);

        $fp = fopen($log_file_name, "a");
        flock($fp, LOCK_EX);
        if(is_array($message))
            $message = self::arrayToString($message);
        $message = sprintf("执行日期:[%s]:%s",date("Y-m-d H:i:s"),$message."\n");
        fwrite($fp, $message);
        fclose($fp);
    }

    /*
     * 将数组转化为特定结构的字符串
     * @param $arr array 待转化数组
     * return $str string 转化后的字符串
     * */
    public static function  arrayToString($arr){
        $str = "";
        if(!is_array($arr))
            return $str;
        foreach($arr as $key => $value){
            if(is_array($value))
                $str .= $key.":".self::arrayToString($value);
            else
                $str .= " ".$key.":".$value." ";
        }
        return "[".$str."]";
    }
}

4.在根目录下创建Config文件夹,在这里建立一个log.php文件

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2016/3/31
 * Time: 19:30
 */
$config = [
    //不同的下标代表不同的日志
    'log01' => BASEDIR."/Logs/log01/",
    'log02' => BASEDIR."/Logs/log02/",
    'Imooc' => BASEDIR."/Logs/Imooc/",
];
return $config;
?php>

5.在index.php文件中调用Log类

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2016/3/27
 * Time: 13:43
 */
//定义项目的根文件路径=>根据自己的项目路径进行定义
define('BASEDIR',__DIR__);
//载入自动加载类
include BASEDIR.'/IMooc/Loader.php';
spl_autoload_register('\\IMooc\\Loader::autoload');
$date = date("Y-m-d H:i:s");
$message=['message'=>'OK','status'=>'200','info'=>['name'=>"DekingChne", "age" => 18]];
//将数组写入log中
\IMooc\Log::log($message,'Imooc');//通过第二个参数进行选择配置的日志路径
?php>

6.运行结果如下:
在根目录下建立了Logs/Imooc/2016-03-31.log日志文件:
图片描述