tp5框架,负载均衡后日志的统一管理(一个基于阿里日志的tp5日志驱动)

最近因为业务增长,导致单台服务器不够用,所有配置了负载均衡,虽然性能上得到了提升,但对于我们开发来说,找BUG,查日志就非常蛋疼了,要上多台服务器上看日志,为了解决日志的统一管理,基于阿里云的日志管理,我写了一个tp5的日志驱动。废话不多说,直接搞起。

阿里云日志php-sdk下载

代码部署
1.将下载下来的代码改个名字改成aliyunlog(原来的名字太长了),统一丢入tp5第三方拓展目录(vendor)下。
2.在thinkphplibrarythinklogdriver(这是tp5日志驱动目录)下新建文件,命名为Aliyun.php,写入如下代码:

 <?php
    namespace think\log\driver;
    use think\App;
    use think\Request;
    use think\Config;
    
    /**
     * 本地化调试输出到文件
     */
    class Aliyun
    {
        protected $config = [
            'endpoint' => 'cn-shanghai.log.aliyuncs.com', // 选择与上面步骤创建项目所属地域匹配的Endpoint
            'accessKeyId' => '******',        // 使用你的阿里云访问密钥AccessKeyId
            'accessKey' => '**********',             // 使用你的阿里云访问密钥AccessKeySecret
            'project' => 'ljlog-test',                  // 输入阿里云日志服务创建的项目名称
            'logstore' => 'ljlog-test'                // 输入阿里云日志服务创建的日志库名称
        ];
        // 实例化并传入参数
        public function __construct($config = [])
        {
            if (is_array($config)) {
                $this->config = array_merge($this->config, $config);
            }
        }
    
        /**
            * 日志写入接口
            * @access public
            * @param array $log 日志信息
            * @return bool
            */
        public function save(array $log = [])
        {
            $insert = [];
            $timestamp = time();
            $datetime = isset($this->config['time_format'])?date($this->config['time_format']):date("Y-m-d H:i:s");
    
            if (App::$debug) {
                if (isset($_SERVER['HTTP_HOST'])) {
                    $insert['current_url'] =  $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
                } else {
                    $insert['current_url'] = "cmd:" . implode(' ', $_SERVER['argv']);
                }
    
                $runtime    = round(microtime(true) - THINK_START_TIME, 10);
                $qps        = $runtime > 0 ? number_format(1 / $runtime, 2). 'req/s]' : '∞'. 'req/s]';
                $runtime_str=  number_format($runtime, 6) . 's';
                $memory_use = number_format((memory_get_usage() - THINK_START_MEM) / 1024, 2);
                $file_load  = count(get_included_files());
                $server     = isset($_SERVER['SERVER_ADDR']) ? $_SERVER['SERVER_ADDR'] : '0.0.0.0';
                $remote     = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '0.0.0.0';
                $method     = isset($_SERVER['REQUEST_METHOD']) ? $_SERVER['REQUEST_METHOD'] : 'CLI';
                $insert     = [
                    'timestamp'=>$timestamp,
                    'datetime'=>$datetime,
                    'method'=>$method,
                    'runtime'=>$runtime_str,
                    'qps'=>$qps,
                    'memory_use'=>$memory_use . 'kb',
                    'file_load'=>$file_load,
                    'server'=>$server,
                    'remote'=>$remote
                ];
            }
    
            $content=[];
            foreach ($log as $type => $val) {
                if (isset($content[$type])) {
                    $n = count($val);
                } else {
                    $n=0;
                }
                foreach ($val as $msg) {
                    if (!is_string($msg)) {
                        $msg = var_export($msg, true);
                    }
                    $insert[$type.'_'.$n]=$msg;
                    $n++;
                }
                // $content .= $type.$msg;
                // if (in_array($type, $this->config['apart_level'])) {
                //     $this->log(['log'=>$content]);
                // }
            }
            dump($insert);
            // $insert['log']=json_encode($content, 256);
          
            //\array_push($insert, $content);
            $this->log($insert);
            return true;
        }
    
        protected function log($insert=[])
        {
            vendor('aliyunlog.Log_Autoload');
            $client = new \Aliyun_Log_Client($this->config['endpoint'], $this->config['accessKeyId'], $this->config['accessKey']);
            #列出当前project下的所有日志库名称
            // $req1 = new \Aliyun_Log_Models_ListLogstoresRequest($project);
            // $res1 = $client->listLogstores($req1);
      
            $topic = "";
            $source = "";
            $logitems = array();
            
            $contents = $insert;
            dump($contents);
            $logItem = new \Aliyun_Log_Models_LogItem();
            $logItem->setTime(time());
            $logItem->setContents($contents);
            array_push($logitems, $logItem);
            
            $req2 = new \Aliyun_Log_Models_PutLogsRequest($this->config['project'], $this->config['logstore'], $topic, $source, $logitems);
            $res2 = $client->putLogs($req2);
        }
    }

3.修改tp5 默认的日志驱动,改为我们新写的日志驱动

打开tp5的config.php文件,找到

  'log'                    => [
        // 日志记录方式,内置 file socket 支持扩展
        'type'  => 'file',
       //'type'  => 'test',
        // 日志保存目录
        'path'  => LOG_PATH,
        // 日志记录级别
        'level' => [],
        //'apart_level'   =>  ['error','sql'],
    ],

改为

   'log'                    => [
    // 日志记录方式,内置 file socket 支持扩展
    'type'  => 'Aliyun',
   //'type'  => 'test',
    // 日志保存目录
    'path'  => LOG_PATH,
    // 日志记录级别
    'level' => [],
    //'apart_level'   =>  ['error','sql'],
],

至此,日志驱动就改好了,赶紧试试吧。
最后说说其它的解决方案,如果是刚开始搭建阿里云的负载均衡,所有的代码可以使用阿里云的文件系统nas,它可以挂载在多台服务服务器,就像云盘一样使用,可以让多台服务器共享代码,减少了繁杂的数据同步,就跟在一台服务器上一样。
博客原地址

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
搭建一个完整的博客系统需要以下几个步骤: 1. 环境配置 在本地或者服务器上安装好PHP环境,搭建好MySQL数据库,并安装好Composer。 2. 创建项目 使用Composer创建一个ThinkPHP 5项目,例如: ``` composer create-project topthink/think blog ``` 3. 数据库配置 在项目的config目录下创建一个database.php文件,设置数据库连接信息,例如: ```php <?php return [ // 数据库类型 'type' => 'mysql', // 服务器地址 'hostname' => '127.0.0.1', // 数据库名 'database' => 'blog', // 用户名 'username' => 'root', // 密码 'password' => '123456', // 端口 'hostport' => '', // 数据库编码默认采用utf8 'charset' => 'utf8', // 数据库表前缀 'prefix' => 'blog_', // 数据库调试模式 'debug' => true, ]; ``` 4. 创建数据表 使用ThinkPHP的数据库迁移工具创建数据表,例如: ``` php think migrate:run ``` 5. 创建模型 在app目录下创建一个model目录,用于存放模型类。例如,创建一个名为Article的模型类,文件路径为app/model/Article.php,代码如下: ```php <?php namespace app\model; use think\Model; class Article extends Model { protected $pk = 'id'; } ``` 6. 创建控制器 在app目录下创建一个controller目录,用于存放控制器类。例如,创建一个名为Index的控制器类,文件路径为app/controller/Index.php,代码如下: ```php <?php namespace app\controller; use app\model\Article; use think\Controller; class Index extends Controller { public function index() { $articles = Article::order('create_time', 'desc')->paginate(10); $this->assign('articles', $articles); return $this->fetch(); } public function detail($id) { $article = Article::find($id); $this->assign('article', $article); return $this->fetch(); } } ``` 7. 创建视图 在项目的view目录下创建一个index目录,用于存放Index控制器类的视图文件。例如,创建一个名为index.html的文件,代码如下: ```html {extend name="layout"} {block name="content"} <div class="articles"> {foreach $articles as $article} <div class="article"> <h2>{$article.title}</h2> <p>{$article.summary}</p> <a href="{url('index/detail', ['id' => $article.id])}">阅读全文</a> </div> {/foreach} </div> <div class="pagination"> {$articles->render()} </div> {/block} ``` 在项目的view目录下创建一个detail目录,用于存放Index控制器类的detail方法的视图文件。例如,创建一个名为detail.html的文件,代码如下: ```html {extend name="layout"} {block name="content"} <h2>{$article.title}</h2> <p>{$article.content}</p> {/block} ``` 8. 创建布局文件 在项目的view目录下创建一个layout.html的文件,用于作为所有页面的布局文件。例如,布局文件的代码如下: ```html <!doctype html> <html> <head> <meta charset="UTF-8"> <title>{$title}</title> </head> <body> <div class="header"> <h1>博客系统</h1> </div> <div class="container"> {block name="content"}{/block} </div> <div class="footer"> <p>版权所有 © 2021</p> </div> </body> </html> ``` 9. 配置路由 在项目的route目录下创建一个route.php文件,配置路由规则,例如: ```php <?php use think\facade\Route; Route::rule('/', 'index/index', 'get'); Route::rule('article/:id', 'index/detail', 'get')->pattern(['id' => '\d+']); ``` 10. 运行项目 在项目根目录下运行以下命令启动项目: ``` php think run ``` 至此,一个简单的博客系统就搭建好了。可以根据实际需求进行功能扩展和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值