SWOOLE 从入门到放弃之写个小框架(十六)

任何框架都必须有Log类,咱们也不能免俗。我决定了,写日志要用异步写文件swoole_async_writefile ,介绍看官网 https://wiki.swoole.com/wiki/page/185.html。用法很简单,和file_put_contents很相似

Log类,必须具备的几个特性,可以记录你想记录的日志,便于调试,不同类型的日志区分存储,最好是分时存储。咱们就照着这个目标来写它。当然了,我还是要用单例模式来写,并且写的还是很简单。
首先,我们给它一些配置信息,比如,规定要存储的日志类型,存储位置等信息,还有一个,因为我们是在终端开发和调试,我们最好还要控制它是否回显到屏幕。。
首先打开frame.base.php ,增加define('LOG_PATH',dirname (__DIR__).'/logs/');//Logs路径
打开config/app.php,在它的下边增加如下代码

//日志
    'log' => [
        //输出到屏幕,当 set.daemonize = false 时,该配置生效,
        'echo'  => 0 ,
        // 日志保存目录
        'path'  => LOG_PATH,
        // 日志记录级别,共8个级别
        'level' => ['EMERGENCY','ALERT','CRITICAL','ERROR','WARNING','NOTICE','INFO','DEBUG','SQL'] ,
    ] ,

创建frame/Lib/Log.php,贴代码

<?php
/**
 * 日志
 */
namespace Piz;
class Log
{
    /**
     * 实例
     * @var object
     */
    private static $instance ;
    /**
     * 配置参数
     * @var array
     */
    private static $config = [] ;

    private function __construct ()
    {
    }

    public static function get_instance(){
        if(is_null (self::$instance)){
            self::$config = Config::get_instance ()->get('app.log');
            self::$instance = new self();
        }
        return self::$instance;
    }

    /**
     * 写入日志
     * @param       $type
     * @param array ...$msg
     */
    public function write($type,...$logs){
        $type = strtoupper ($type);
        $msg = "{$type} \t ".date("Y-m-d h:i:s")." \t ".join (" \t ",$logs);
        if( !in_array($type,self::$config['level'])) return false;
        if(self::$config['echo']){
            echo $msg,PHP_EOL;
        }
        $this->save($type,$msg);
    }
    public function save($type,$msg){
        if (empty(self::$logs)) return false;
        $dir_path = LOG_PATH.date('Ymd').DIRECTORY_SEPARATOR;
        !is_dir($dir_path) && mkdir($dir_path,0777);
        $filename  = date("h").'.'.$type.'.log';
        swoole_async_writefile($dir_path.$filename , $msg, NULL, FILE_APPEND);
        return true;
    }

}

为了便于操作,必须在frame/helper.php下暴露一个简单的调用方法,代码如下

/**
 * 写入日志
 * @param       $type       EMERGENCY,ALERT,CRITICAL,ERROR,WARNING,NOTICE,INFO,DEBUG
 * @param array ...$log     标量参数,可多个
 */
function logs($type,...$log){
    get_instance('\Piz\Log')->write($type,...$log);
}

现在它可以用了,无论在哪个位置,都可以用了,在框架内,我建议用长方法Log::get_instance()->write('XXX','XX','XXX'),在项目中建议使用logs('xxxx','xx','xx')
小伙伴们请求意Log::get_instance()->write($type,...$logs),后面的 …$logs 它是一个标量,关于PHP7的标量说明,请看官网 http://php.net/manual/zh/migration70.new-features.php

小伙伴们可以在任何需要调用它的位置来记录日志了。

我试着启动运行并用ab压测了一下,QPS怎么只有1K多,这离我设定的10K的目标差太多了。。。。
什么情况,这一切的背后, 是人性的扭曲还是道德的沦丧?
请看下一期,优化Log,拉高性能。。

代码已上传到码云。。https://gitee.com/pizzzz/piz.git

点赞