Laravel - 将 Guzzle 请求记录到文件

2024-03-01

在开发一个项目时,我发现第三方 API 可以在 Postman 中运行,但不能在 Guzzle Client 中运行。

调试 Guzzle 请求可能很困难,那么有没有什么方法可以记录 Guzzle 客户端发出的所有请求?


TLDR;

有一种简单的方法可以通过将第二个参数传递给客户端来记录所有 Guzzle 请求,然后它将记录所有请求。但如果你有很多方法使用 Guzzle Client 向第三方服务器发送请求,那么这种方式就很丑陋。我已经使用 Laravel 的服务容器完成了它。

通过 Laravel 服务容器进行长途旅行

当我在项目中使用 Guzzle 客户端并使用处理程序记录所有请求时,它看起来不错。但后来在许多不同的类中有很多方法,所以我必须在每个地方编写记录器逻辑。然后我想为什么不利用 Laravel 的服务容器并绑定一个对象一次并在任何地方使用它。

我是这样做的。在你的AppServiceContainer.php的 boot 方法中,我们将添加所有代码。然后在控制器中我们将使用我们的客户端对象。

在上面添加这个 use 语句AppServiceContainer.php file.

use GuzzleHttp\Client;
use GuzzleHttp\HandlerStack;
use GuzzleHttp\MessageFormatter;
use GuzzleHttp\Middleware;
use Illuminate\Support\ServiceProvider;
use Monolog\Handler\RotatingFileHandler;
use Monolog\Logger;

将以下代码添加到您的应用程序服务Container.phpboot method

/**
 * Bootstrap any application services.
 *
 * @return void
 */
public function boot()
    {
        $this->app->bind('GuzzleClient', function () {

            $messageFormats = [
                'REQUEST: {method} - {uri} - HTTP/{version} - {req_headers} - {req_body}',
                'RESPONSE: {code} - {res_body}',
            ];

            $stack = HandlerStack::create();

            collect($messageFormats)->each(function ($messageFormat) use ($stack) {
                // We'll use unshift instead of push, to add the middleware to the bottom of the stack, not the top
                $stack->unshift(
                    Middleware::log(
                        with(new Logger('guzzle-log'))->pushHandler(
                            new RotatingFileHandler(storage_path('logs/guzzle-log.log'))
                        ),
                        new MessageFormatter($messageFormat)
                    )
                );
            });

            return function ($config) use ($stack){
                return new Client(array_merge($config, ['handler' => $stack]));
            };
        });
    }

解释

如果您注意到上面的代码,在 boot 方法的第一行中,我们告诉 Laravel 我们希望将此代码注册为服务容器中的 Guzzle 客户端。

在最后一个 return 语句中,我们返回一个接受一个参数的函数$config。我们使用这个函数作为代理,以便我们可以向它传递一个参数,并且可以在客户端对象中使用。

return function ($config) use ($stack){
      return new Client(array_merge($config, ['handler' => $stack]));
};

其余代码正在构建 Guzzle 的处理程序对象,以将所有请求记录到名为guzzle-log.log使用 Monolog 库的 Logger 对象。如果您启用了每日日志,则会将日期附加到文件名中,例如guzzle-log-2019-08-11.log. Usage

我们已经将对象绑定到服务容器,现在是时候在代码中的任何地方使用这个容器,并使其看起来干净了。

为了演示目的,我直接使用它routes/web.php文件。您可以在任何地方使用。

 Route::get('/', function () {

    $client = app('GuzzleClient')(['base_uri' => 'http://httpbin.org/']);

    $request = $client->get('get',[
        'query' => ['foo'=>'bar', 'baz' => 'baz2'] ,
        'headers' => [ 'accept' =>  'application/json']
    ]);
    $response = json_decode((string) $request->getBody());
    return response()->json($response);
});

正如你所看到的,我正在制作一个物体$client using app()帮手。您还可以传递 Guzzle 客户端支持的任何有效参数数组作为第二个参数。这里我已经过去了base_uri.

Source: http://shyammakwana.me/laravel/laravel-log-guzzle-requests-to-file-using-service-container.html http://shyammakwana.me/laravel/laravel-log-guzzle-requests-to-file-using-service-container.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Laravel - 将 Guzzle 请求记录到文件 的相关文章

  • 我如何在 Laravel 5.5 的 FormRequest 类中返回自定义响应?

    我正在制作一个 API 我想返回错误数组 其格式如下 validator gt errors 当我通过手动方式验证请求时生成 但我无法操纵响应 我想找到正确的制作方法 这可以在 Laravel 5 4 中通过formatErrors方法并包
  • 未捕获的异常:无法找到 Mix 文件

    我正在尝试在本地系统中运行 laravel 应用程序 我已遵循https gist github com hootlex da59b91c628a6688ceb1 https gist github com hootlex da59b91c
  • 无法合并 Laravel 中的 Eloquent 集合

    我需要在 Laravel 5 1 中合并集合或数组 可以是其中之一 但在 Builder php 第 2071 行中收到错误 BadMethodCallException 调用未定义的方法 Illuminate Database Query
  • .NET Web API - 添加日志记录

    我正在寻找有关处理 API 日志记录的最佳方法的帮助 我想将所有请求和响应记录到 sql 或文本文件 如果这是最好的方法 目前我已经在 SQL Server 的日志表中插入一行 我使用名为 LogAction 的静态方法来执行此操作 并在
  • Dingo API 删除“数据”信封

    有没有一种简单的方法可以从 Dingo API 响应中删除 数据 信封 当我使用这个 Transformer 来转换用户模型时 class UserTransformer extends EloquentModelTransformer L
  • SLF4J 日志记录到文件 vs. DB vs. Solr

    我需要一些关于 SLF4J 日志记录的建议 目前 我们正在为 Java Web 应用程序使用 SLF4J 日志记录 log4j 绑定 该应用程序使用简单的 ConsoleAppender 我们的下一步是研究可以保存日志的地方 我们的应用程序
  • laravel 基本查询中“允许的内存大小已耗尽 134217728 字节”

    我不知道为什么我无法让以下工作正常工作 DB table twitter hashtags gt paginate 5 每次我得到 第二个数字往往不同 Allowed memory size of 134217728 bytes exhau
  • Laravel 如何使用查询生成器返回单列值

    我想使用 SQL 查询中的数据 为了进一步解释它 这里是我的代码 myquery DB table attendances gt select user id gt where date only newdate gt orderBy lo
  • 如何在 MySQL 中存储工作日列表?

    我正在使用编写一个应用程序PHP我需要存储一个独特的工作日列表MySQL 在应用程序中 我有一个数组来存储工作日 如下所示 days Wed Thu Sat 我知道我可以使用SET列 但我不想使用这种类型 因为它与我正在使用的框架 Lara
  • 验证 Laravel 中的选择表单

    我的联系表上有这个 html div class form group div
  • Laravel 5 模型 $cats 到数组 utf-8 JSON_UNESCAPED_UNICODE

    当您有一个数组字段并将其保存在数据库中时 它会对数组进行漂亮的 json encode 但没有 JSON UNESCAPED UNICODE 选项 数据最终如下所示 en u039d u03ad u03b1 这几乎没什么用 解决方案当然是使
  • 从 pandas udf 记录

    我正在尝试从 python 转换中调用的 pandas udf 进行日志记录 因为在执行器上调用的代码不会显示在驱动程序的日志中 我一直在寻找一些选项 但到目前为止最接近的选项是这个one https stackoverflow com q
  • 使用 laravel 检查活动用户状态

    这是非常标准的登录功能和验证 效果很好 但我还想检查用户是否处于活动状态 我在用户表中设置了一列 并将 活动 设置为 0 或 1 public function post login input Input all rules array
  • 在 Laravel 5.4 中选择下拉列表的选定值

    我有一个名为 名称 的下拉列表 用户将在其中选择其中一个 提交后 如果出现一些错误 那么我想选择所选的名称 我在 laravel 5 4 中使用它 控制器 info DB table designation gt where status
  • 如何从 Laravel 将路由参数传递到 Vue.js

    我有这样的路线来获取带有相关评论的帖子 Route get api topics category id title function category id title return App Topic with comments gt
  • 在 Ubuntu 16.04 中创建虚拟主机

    我已经开始在 laravel 中工作并使用 lampp 我看过很多使用虚拟主机来制作用户友好的 url 的教程 我想在 Ubuntu 16 04 上执行此操作 以下教程对我不起作用 https ourcodeworld com articl
  • 关闭应用程序后如何调试

    我正在尝试重现问题 这需要在特定位置关闭并重新打开我的应用程序 这是我的问题 1 如何查看我的日志 使用NSLog命令 当我的 iPhone 未连接到 XCode 时 2 是否可以将iPhone模拟器的特定位置 例如市中心 设置为默认位置
  • 如何使用 keycloak 强制每个客户端登录(最佳实践?)

    我们目前正在实施 keycloak 但我们面临着一个问题 我们不确定解决它的最佳方法是什么 我们有不同的网络应用程序使用单点登录 并且运行良好 我们遇到的问题是 当我们在一个 Web 应用程序中使用 sso 登录 然后在另一个 Web 应用
  • 哎呀,看起来像出事了。拉拉维尔 5.1

    我有这样的路线 http localhost inspection show id 当我尝试同时加载路线时 在不同的选项卡中 有时其中一些选项卡会出现错误 哎呀 看起来出了问题 在不同选项卡中加载速度如此之快 http localhost
  • 将应用程序级别用户名/用户 ID 注入 nginx/Apache 日志

    有没有办法将应用程序级别的用户名或 id 在本例中为 django 用户名或 id 注入 Apache 或 ngnix 日志中 请注意 我不是询问 HTTP 身份验证用户名 我目前正在使用一个简短的自定义中间件将此数据添加到响应标头 如下所

随机推荐

  • 如何在 Rails 3 应用程序中分析请求

    如何在 Rails 3 应用程序中分析请求 这个答案 https stackoverflow com questions 2716418 how can i profile a request in rails似乎只适用于 2 我应该如何在
  • Java位移位的奇怪之处

    Java 有 2 个用于右移的位移运算符 gt gt shifts right and is dependant on the sign bit for the sign of the result gt gt gt shifts righ
  • Python + Beam + Flink

    我一直在尝试让 Apache Beam 可移植性框架与 Python 和 Apache Flink 一起使用 但我似乎找不到一套完整的指令来让环境正常工作 是否有任何参考资料包含使简单的 python 管道正常工作的先决条件和步骤的完整列表
  • PHP:如何彻底防止XSS攻击?

    如何才能完全防止 PHP 中的 xss 攻击 这是假设我不关心任何 HTML 标签或其他格式 仅运行 strip tags 并使其完全安全就足够了吗 Both htmlspecialchars and strip tags 被认为可以安全地
  • 使用 PyPDF2 将嵌套书签添加到 PDF

    的文档PyPDF2 https github com mstamy2 PyPDF2 指出可以向 PDF 文件添加嵌套书签 并且代码出现 阅读后 以支持此操作 向根树添加书签很容易 请参见下面的代码 但我无法弄清楚我需要传递什么作为paren
  • Visual Studio 2010 XAML 编辑器尴尬的 IntelliSense?

    在 Visual Studio C 文本编辑器中 当您需要属性时 只需键入prop然后点击两次选项卡即可获取属性的 片段 模板 类型和属性名称都会突出显示 当您想要在类型和属性之间切换时 请按 Tab 键 然后在完成后按 Enter 键 光
  • 如何在 Rust 中将字符串转换为字节向量?

    这可能是有史以来最愚蠢的 Rustlang 问题 但我保证我会尽力在文档或网络上的任何其他地方找到答案 我可以将字符串转换为字节向量 如下所示 let bar bytes some string 不幸的是我不能这样做 let foo som
  • 如何在同一解决方案中运行/调试多个 Web 应用程序项目?

    我有 2 个网络应用程序项目 一个是我的 asp net MVC 应用程序 另一个是与管理相关的功能 即 asp net Web 表单动态数据 我的 MVC 应用程序将是主站点 但我希望 Web 表单在 MVC 站点的 Admin 文件夹下
  • 如何调试 git 别名?

    调试git使用 shell 命令和引用使用别名可能很困难 我怎样才能看到什么git正在为给定的别名执行 In your gitconfig 添加以下内容 debug GIT TRACE 1 git 然后你就可以运行git debug
  • Xamarin.iOS:可执行文件已使用无效权利进行签名

    我最近添加了通知 FCM 到使用以下方法开发的 iOS 应用程序Xamarin iOS 当我尝试在已发布的设备 iPad 和 iPhone 上安装时 安装失败 我发现的所有类似问题都与本机开发有关 我尝试重新生成配置文件 删除并再次添加推送
  • BeautifulSoup find_all() 不返回任何数据

    我对 Python 很陌生 我最近的项目是从博彩网站抓取数据 我想要抓取的是网页上的赔率信息 这是我的代码 from urllib request import urlopen as uReq from bs4 import Beautif
  • 如何以编程方式列出 Rails 中的所有控制器

    我正在尝试构建一个 RESTful 应用程序来实际管理多种可配置对象 因此有大量的 资源 类型 因此有很多控制器 我仍处于 POC 阶段 所以如果我可以在第一个导航页面中显示所有控制器 那就太好了 那么有什么简单的方法 可编程 可以做到这一
  • 如何在 Silverlight 中更改 Textblock 的背景颜色?

    我想要一个黄色背景上有蓝色文本的文本块 我可以使用 前景 属性设置蓝色文本 但 背景 不起作用 我想那太简单了 那么最好的方法是什么 将其包裹在具有背景颜色的矩形或画布中 并且 我们是否应该了解有关 Silverlight 的任何内容 以了
  • 无法使用 ACI 卷。所需的驱动程序是“azure_file”

    尝试使用以下方式在 Azure 中部署此应用程序docker compose version 3 5 x environment default back environment Database settings POSTGRES DB
  • 在javascript中动态更新嵌套对象[重复]

    这个问题在这里已经有答案了 我有一个从 json 解码的对象 var data parentSeries 1 children BusinessRule ChrisTest2 ID ChrisTest2 3 childsub 3 jsonC
  • 如何在 Visual Studio 中将构建配置更改为发布?

    我正在尝试发布一个 Xamarin 项目 我怎样才能将构建配置更改为Release在 Visual Studio 2015 中 Update I have found the solution here it is 根据如何 设置调试和发布
  • 在 Composer 中设置“config.fxp-asset.installer-paths”选项

    当我运行composer update在继续更新之前我收到以下警告 The extra asset installer paths option is deprecated use the config fxp asset installe
  • 设计更好的 API?

    设计 API 时应遵循哪些最佳实践和模式 如何实现隐藏的最佳方式 C Java 设计本质上通用的 API 有哪些参考书 链接可以为初学者提供简洁的示例指导吗 我不确定我对你们所有的个人问题都有一个很好的答案 但我想我对第一个问题确实有一个很
  • isBeingPresented 值不一致

    我以模态方式呈现一个带有 ViewController 的 NavigationController 在 ViewController 中我可以看到self navigationController isBeingPresented是真的
  • Laravel - 将 Guzzle 请求记录到文件

    在开发一个项目时 我发现第三方 API 可以在 Postman 中运行 但不能在 Guzzle Client 中运行 调试 Guzzle 请求可能很困难 那么有没有什么方法可以记录 Guzzle 客户端发出的所有请求 TLDR 有一种简单的