GA黄金甲

怎样使用ThinkPHP6举行异步日志纪录操作?

随着互联网的高速生长 ,日志纪录效劳成为了每个大型 web 应用必不可少的?。为了利便过失排查、性能监控等种种需求 ,本文将先容怎样使用 thinkphp6 框架举行异步日志纪录操作。

1. 什么是日志纪录

在盘算机科学领域 ,日志纪录是指将盘算机系统中爆发的事务和信息纪录下来。通常 ,这些纪录都以文件或数据库的形式存储。日志纪录有助于相识系统运行状态 ,实时发明息争决问题 ,进而提高系统的可靠性和稳固性。

在 web 应用中 ,日志纪录可以资助开发者更好地相识系统的遇到的问题和过失。依据日志纪录 ,开发者可以清晰地相识应用的行为以及过失爆发的位置和时机。

2. ThinkPHP6 异步日志纪录

在应用开发历程中 ,日志纪录是一个必不可少的?。并且 ,日志纪录经常是一个耗时的操作 ,若是同步执行的话会影响系统的性能。为此 ,ThinkPHP6 引入了异步日志纪录的功效 ,让日志纪录不再影响应用的响应速率。

通常在控制器或模子中纪录日志 ,我们使用注入 PsrLogLoggerInterface 接口来实现。

连忙学习“PHP免费学习条记(深入)”;

// Controller或Model中
use PsrLogLoggerInterface;

public function index(LoggerInterface $logger){
    $logger->info('hello world');
}

登录后复制

简朴的使用方法。使用异步日志纪录 ,界说一个异步日志纪录器:

use MonologLogger;
use MonologHandlerStreamHandler;

$logger=new Logger("AsyncLogger");
$logger->pushHandler(new StreamHandler('runtime/log/async.log'), Logger::INFO);

登录后复制

日志纪录器界说好后 ,使用行列发送日志纪录信息 ,这里我们选择使用 RabbitMQ 当做行列效劳。

// Message类
namespace appcommon;

class Message
{
    /**
     * 纪录日志
     * @param $level
     * @param $message
     * @param array $context
     * @return bool
     */
    public static function log($level,$message,array $context=[]){
        $data=[
            'level'=>$level,
            'message'=>$message,
            'context'=>$context,
            'channel'=>'AsyncLogger',
            'datetime'=>date('Y-m-d H:i:s'),
            'host'=>$_SERVER['SERVER_ADDR'] ?? '',
            'uri'=>$_SERVER['REQUEST_URI'] ?? '',
        ];

        $producer=Queue::getConnection('AsyncLogger',true);
        $producer->setExchangeOptions(['name'=>'async_logs','type'=>'topic','durable'=>true])->declareExchange();

        try{
            $producer->publish(json_encode($data),[
                'routing_key' =>'log',
                'exchange' =>'async_logs',
            ]);
            return true;
        }catch (Exception $e){
            return false;
        }
    }
}

登录后复制

其中 ,我们使用 appcommonQueue 类来提供 rabbitmq 的毗连实例;data中除了纪录日志的信息外 ,还包括一些情形信息 ,好比时间、IP地点、请求的uri地点等。

行列处置惩罚程序:

// Consumer类
use BunnyMessage;
use PsrLogLoggerInterface;

class Consumer
{
    /**
     * @param Message $message
     * @param LoggerInterface $logger
     */
    public function process(Message $message,LoggerInterface $logger){
        $body=$message->content;
        $data= json_decode($body,true);
        $channel=$data['channel'] ?? 'default_logger';

        $logger->notice($data['message'], $data);
    }
}

登录后复制

虽然 ,我们还需要一个辅助处置惩罚日志的类。

// Queue类
namespace appcommon;

use BunnyAsyncClient;
use BunnyChannel;
use BunnyMessage;
use BunnyProtocolMethodBasicConsumeOkFrame;
use BunnyProtocolMethodChannelCloseFrame;
use BunnyProtocolMethodChannelCloseOkFrame;
use BunnyProtocolMethodConnectionCloseFrame;
use BunnyProtocolMethodConnectionCloseOkFrame;
use BunnyProtocolMethodConnectionStartFrame;
use BunnyClientStateEnum;
use BunnyMessage as BunnyMessage;

class Queue
{
    /**
     * @param string $queueName
     * @return Client|null
     */
    public static function getConnection(string $routingKey, bool $persistent=false):?Client
    {
        $config=config('rabbitmq.async_log');
        $client=new Client([
            'host' => $config['host'],
            'port' => $config['port'],
            'user' => $config['user'],
            'password' => $config['password'],
            'vhost' => $config['vhost'],//注重此处改为需要的 VHOST
            'concurrency' => 2,
        ]);

        try{
            $client->connect();
            $client->channel()
                ->then(function (Channel $channel) use($client,$routingKey,$persistent){
                    $channel->exchangeDeclare('async_logs','topic',true,true);
                    $channel->queueDeclare($routingKey, $passive=false,$durable=true,$exclusive=false,$autoDelete=false,$nowait=false);
                    $channel->queueBind($routingKey, 'async_logs', $routingKey);

                    $channel->consume(
                        function ($msg, Channel $channel, BunnyMessage $message) use($client,$routingKey){
                            $className=config('rabbitmq.async_log.consumer');
                            $consumer=new $className($client,$routingKey);
                            $consumer->process($message,app('log.async_logger'));
                            $channel->ack($msg);//处置惩罚新闻
                        },
                        $routingKey,//行列Name
                        '',//消耗Tag
                        false,//no_local
                        false,//no_ack
                        false,//exclusive
                        $persistent ? ['delivery_mode'=>2] : []
                    );
                });
        }catch (Exception $e){
            return null;
        }finally{
            return $client;
        }
    }
}

登录后复制

上面这段代码中界说了行列毗连的 host、port 等 ,通过 $client->channel() 建设了一个 channel 工具 ,通过 $channel->exchangeDeclare() 和 $channel->queueDeclare() 建设了 exchange 和 queue ,并将它们举行了绑定。最后 ,使用 $channel->consume() 异步消耗行列的新闻 ,并将新闻发送到新闻处置惩罚类中。

3. 总结

本文先容了怎样使用 ThinkPHP6 框架举行异步日志纪录操作 ,使日志纪录不再影响应用的响应速率。总体来说 ,以下是操作办法:

开发自己的异步日志纪录器

使用 RabbitMQ 举行新闻行列处置惩罚

编写新闻处置惩罚程序

在现实项目中 ,我们需要凭证详细的需求来优化代码和调解行列的设置。通过异步纪录日志 ,可以有用提高 web 应用的运行效率 ,并提高系统的稳固性与可靠性。

以上就是怎样使用ThinkPHP6举行异步日志纪录操作?的详细内容 ,更多请关注本网内其它相关文章!

免责说明:以上展示内容泉源于相助媒体、企业机构、网友提供或网络网络整理 ,版权争议与本站无关 ,文章涉及看法与看法不代表GA黄金甲滤油机网官方态度 ,请读者仅做参考。本文接待转载 ,转载请说明来由。若您以为本文侵占了您的版权信息 ,或您发明该内容有任何涉及有违公德、冒犯执法等违法信息 ,请您连忙联系GA黄金甲实时修正或删除。

相关新闻

联系GA黄金甲

18523999891

可微信在线咨询

事情时间:周一至周五 ,9:30-18:30 ,节沐日休息

QR code
【网站地图】【sitemap】