hyperf 追踪

文章讲述了如何在Hyperf框架中利用日志和上下文追踪ID实现会话追踪,通过封装Log类和在HTTP接口中添加追踪ID,以及异常捕捉中间件的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为什么是追踪?

hyperf官网有用链追踪,需要配合其他第三方应用,有些应用怎么简单怎么部署,能不能用日志来实现追踪?

当然可以,通过上下文+封装Log类+接口统一响应

原理

  • 上下文设置会话追踪ID
  • 封装Log类输出日志统一带上会话追踪ID
  • 接口统一响应返回会话追踪ID方便后续查找

封装Log

<?php
declare(strict_types=1);

namespace App;

use Hyperf\Logger\LoggerFactory;
use Hyperf\Context\ApplicationContext;

class Log
{
    public static function get(string $name = 'app')
    {
        return ApplicationContext::getContainer()->get(LoggerFactory::class)->get($name);
    }

    /**
     * 生成追踪ID
     * @return void
     */
    private static function newTraceId()
    {
        Context::set('trace_id' , uniqid());
    }

    // TODO 是否需要增加设置追踪ID的方法,用于队列追踪或其他应用调用链路追踪

    /**
     * 获取追踪ID
     * @return mixed
     */
    public static function getCxtTraceId()
    {
        $traceId = Context::get('trace_id');
        if(empty($traceId)){
            self::newTraceId();
        }
        return $traceId;
    }

    /**
     * 获取日志前缀包含追踪ID
     * @return string
     */
    private static function getSuffix()
    {
        $traceId = self::getCxtTraceId();
        return ' traceId=' . $traceId.' |';
    }

    /**
     * 输出日志
     * @param $message
     * @return mixed
     */
    public static function info($message='')
    {
        $message = self::getSuffix().$message;
        return self::get()->info($message);
    }
}

接口统一响应

<?php

declare(strict_types=1);

namespace App\Controller;

use Hyperf\HttpServer\Contract\RequestInterface;
use Hyperf\HttpServer\Contract\ResponseInterface;
use Psr\Container\ContainerInterface;
use App\Log;
use Hyperf\Di\Annotation\Inject;

abstract class AbstractController
{
    /**
     * @Inject
     * @var ContainerInterface
     */
    protected $container;

    /**
     * @Inject
     * @var RequestInterface
     */
    protected $request;

    /**
     * @Inject
     * @var ResponseInterface
     */
    protected $response;

    protected function success($data = [])
    {
        return $this->response->json([
            'code' => 0,
            'data' => $data,
            'trace_id' => Log::getCxtTraceId()
        ]);
    }

    protected function fail($code, $message = '')
    {
        return $this->response->json([
            'code' => $code,
            'message' => $message,
            'trace_id' => Log::getCxtTraceId()
        ]);
    }
}

其他

  • 异常捕捉
  • 中间件捕捉
  • 是否可以直接全局修改Response的响应结果
06-18
### Hyperf框架使用教程及介绍 Hyperf 是一个基于 PHP 的高性能协程框架,专注于超高速和灵活性,适用于构建微服务或中间件[^2]。以下是关于 Hyperf 框架的详细使用教程及介绍: #### 1. 环境准备 在 Windows 系统下,可以通过 Docker 部署 Hyperf 框架。具体步骤如下: - 使用 `-v` 参数将本地代码路径挂载到容器中,例如: ```bash -v D:/phpstudy_pro/WWW/hyperf:/data/project ``` 其中 `D:/phpstudy_pro/WWW/hyperf` 是 Windows 本机上的 Hyperf 项目路径,而 `/data/project` 是容器内的代码路径[^1]。 #### 2. 创建 Hyperf 项目 通过 Composer 工具创建一个新的 Hyperf 项目: ```bash composer create-project hyperf/hyperf-skeleton your_project_name ``` 此命令会下载并初始化一个基于 Hyperf 的骨架项目[^2]。 #### 3. 启动 Hyperf 项目 Hyperf 的启动主要依赖于 `bootstrap.php` 文件,它是整个应用程序的入口点,负责初始化框架的核心组件和服务[^3]。在开发环境中,通常使用以下命令启动服务: ```bash php bin/hyperf start ``` 该命令会在后台启动 Hyperf 的 HTTP 和 TCP 服务。 #### 4. 配置文件说明 Hyperf 的配置文件位于项目的 `config` 目录下。主要配置文件包括但不限于: - `config/autoload`: 自动加载配置。 - `config/databases.php`: 数据库配置。 - `config/app.php`: 应用基础配置。 开发者可以根据需求修改这些文件来调整框架的行为[^3]。 #### 5. 核心源码解析 对于深入学习 Hyperf 的开发者,可以参考相关源码解析资料[^4]。例如,辅助视频可以帮助理解框架内部的工作机制: [Hyperf框架核心源码讲析](https://www.bilibili.com/video/BV1354y157S7/?p=1&vd_source=23895afa07bb1ceeeb2f0a557f472bd5)[^4]。 --- ### 示例代码:启动 Hyperf 服务 以下是一个简单的 Hyperf 项目启动示例: ```php <?php // bootstrap.php 文件内容 use Hyperf\Utils\Coroutine; require __DIR__ . '/../vendor/autoload.php'; // 初始化应用 $app = require __DIR__ . '/app.php'; // 运行应用 $app->run(); ``` ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值