摘要

前面我们讨论过在大型应用中通过消息队列将集中式的同步执行的相关计算任务拆分为分布式运行,也就是实现异步处理以此加快web执行的响应时间和提升用户体验。为了更好的完成各部分的计算任务和保证业务处理的有效性和质量,我们还需要对各个部分的处理过程和处理结果进行日志记录和跟踪,但由于采用传统的自建数据库和本地文件形式保存各种日志的方式存在着一些局限,如后期快速建立索引进行历史日志查询,跟踪日志并通过多个通信渠道发送给运维人员告警通知,日志的备份和周期覆盖存储等,如果均采用自建日志存储服务器方案,我们可能需要在这方面投入更多。阿里云的日志存储和分析服务(SLS&LOG)是一套几乎完整的日志管理解决方案,本文中我们主要记录如何在Symfony中配置和使用该项服务。

业务日志

业务日志是针对业务运行中的发生的来自用户、系统、第三方触发的各类事件如调试、警告、错误所做出的一般记录,便于应用程序对特定事件进行处理和业务运维人员对应用的维护。实际应用中也非常好举例,比如我们会对用户账户发生异常登录行为进行IP地址和操作相关信息进行记录,对用户下单的成功或失败的操作进行记录,对管理员、运维人员的敏感操作进行特殊记录等。业务日志同时还可以对特定告警事件做出通知触发,如邮件、短信、即时聊天软件给运维人员通知,访问特定的回调URL等等。下图可以很直观介绍阿里云日志服务的工作模式和特点:

阿里云日志服务的工作模式和特点 - 图片自Alibabacloud.com《什么是日志服务》

SLS SDK

本次实践中我们采用的是阿里云提供的日志服务,我们需要通过composer命令行为Symfony应用安装阿里云日志服务的PHP SDK。经过一番搜索和对比之后,我采用了改动较小的maiscrm/aliyun-log-php-sdk项目,该项目您可以在Packagist上找到项目地址并通过下列composer命令安装到您的Symfony项目中。

composer require maiscrm/aliyun-log-php-sdk

话题和分类

阿里云的日志解决服务方案中为我们的单个日志项目提供了话题和分类功能,来帮助我们在同个应用创建不同的跟踪频道(topic),同时日志可通过SDK进行分为:info、debug、error、warn四个类型。方便我们采集日志后通过控制台进行索引和查询。为了统一处理项目中的分类,我们对SDK的日志方法进行再次封装,以便于以后SDK出现升级或其他更改,对项目做出更方便的维护。

<?php

namespace App\CloudService;

class AliyunLogService {

    private $client;

    private $logger;

    public function __construct($logstore, $topic)
    {
        $this->client = new \Aliyun_Log_Client("日志服务节点域名", "YOUR ACCESS KEY ID","YOUR ACCESS KEY");
        $this->logger = new \Aliyun_Log_SimpleLogger($this->client,"cloudra",$logstore,$topic,"50","60","2000");

    }

    public function info(array $logdata){
        $this->logger->infoArray($logdata);
        $this->logger->logFlush();
    }

    public function error(array $logdata){
        $this->logger->errorArray($logdata);
        $this->logger->logFlush();
    }

    public function debug(array $logdata){
        $this->logger->debugArray($logdata);
        $this->logger->logFlush();
    }

    public function warn(array $logdata){
        $this->logger->warnArray($logdata);
        $this->logger->logFlush();
    }
}

以上封装所用到的accessKey信息和日志服务节点网址信息都需要您前往阿里云控制台进行获取。当然,您也可以将SDK的认证信息写入Symfony的.env文件中再修改以上封装代码。

应用

完成以上封装操作后,您便可以再任何需要写入日志的代码中进行应用,比如我们需要记录用户在数字证书签发过程中的一些信息,我们可以进行如下应用:

    
    private $logger;

    public function __construct()
    {
        $this->logger = new AliyunLogService('cacommon','SSLOrderProcess');
    }

    public function example(){
       $this->logger->debug([
            "action"    =>  "Submit SSL Order",
            "serviceId"    =>  $serviceId,
            "clientId" =>  $cert->getClientId(),
            "status"    =>  "SUCCESS",
            "orderNumber" => $result['orderNumber'],
            "expectedDeliveryTime"  =>  $result['expectedDeliveryTime'],
            "certificateStatus"  =>  $result['certificateStatus'],
        ]);
    }

通过以上调用,您就可以成功向阿里云日志服务项目中创建一条日志记录。创建日志记录时,您可以根据您的需求传入更多的键-值对,这些健都可以通过阿里云日志服务控制台进行索引和查询。

查询

登录阿里云日志服务控制台-配置和查询日志

成功的写入日志之后,您就可以通过阿里云日志服务控制台进行日志查询了,同时,阿里云还为日志服务配备了集成式的监控和通知服务,您可以根据日志项目需求,在特定日志事件发生后出发短信、邮件、IM通知给您或运维人员,也支持配置回调URL。

标签: Symfony, 阿里云, 日志

添加新评论