You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Magento 2日志集中管理及支付方式日志远程存储方案咨询

Magento 2 支付方式独立日志配置与远程存储方案

Got it, let's break this down into two core parts: setting up separate log files for each payment method (Authorize.net and PayPal) in Magento 2, and configuring those logs to be stored remotely. I've implemented this for several e-commerce projects, so here's a practical, step-by-step guide that should work for you.


1. 为支付方式创建独立日志文件

Magento 2 底层基于 Monolog 实现日志系统,我们可以通过自定义Logger和Handler来为每种支付方式拆分独立日志文件。

1.1 定义自定义Logger与Handler(以Authorize.net为例)

首先创建一个自定义模块(如果还没有的话),比如命名为 Vendor_PaymentLogger

在模块的 app/code/Vendor/PaymentLogger/etc/di.xml 中添加以下配置:

<!-- Authorize.net 日志处理器 -->
<type name="Monolog\Handler\StreamHandler">
    <arguments>
        <argument name="stream" xsi:type="string">var/log/payment/authorize_net.log</argument>
        <argument name="level" xsi:type="number">Monolog\Logger::INFO</argument>
    </arguments>
    <alias name="authorizeNetLogHandler"/>
</type>

<!-- Authorize.net 日志实例 -->
<type name="Vendor\PaymentLogger\Logger\AuthorizeNetLogger">
    <arguments>
        <argument name="name" xsi:type="string">authorize_net</argument>
        <argument name="handlers" xsi:type="array">
            <item name="stream" xsi:type="object">authorizeNetLogHandler</item>
        </argument>
    </arguments>
</type>

PayPal的配置完全类似,只需要把日志路径改为 var/log/payment/paypal.log,别名和Logger名称替换为 paypalLogHandlerPayPalLogger 即可。

1.2 创建Logger类文件

app/code/Vendor/PaymentLogger/Logger/AuthorizeNetLogger.php 中创建Logger类:

<?php
namespace Vendor\PaymentLogger\Logger;

use Monolog\Logger;

class AuthorizeNetLogger extends Logger
{
}

同样复制一份改为 PayPalLogger.php,只修改命名空间和类名即可。

1.3 在支付处理类中注入并使用Logger

将自定义Logger注入到支付方式的核心处理类中,比如Authorize.net的 Directpost 模型(或你自定义的支付扩展类):

<?php
namespace Magento\Authorizenet\Model;

use Vendor\PaymentLogger\Logger\AuthorizeNetLogger;

class Directpost extends \Magento\Payment\Model\Method\AbstractMethod
{
    protected $authorizeNetLogger;

    public function __construct(
        // 保留原有构造参数
        AuthorizeNetLogger $authorizeNetLogger,
        ...
    ) {
        // 保留原有初始化逻辑
        $this->authorizeNetLogger = $authorizeNetLogger;
        ...
    }

    // 在支付处理方法中记录日志示例
    public function processPayment($payment)
    {
        // 记录支付请求信息
        $this->authorizeNetLogger->info('Authorize.net 支付请求', [
            '订单ID' => $payment->getOrder()->getId(),
            '支付金额' => $payment->getAmount(),
            '请求参数' => $payment->getAdditionalInformation()
        ]);

        // 处理支付后记录响应信息
        $response = $this->getGatewayResponse();
        $this->authorizeNetLogger->info('Authorize.net 支付响应', [
            '订单ID' => $payment->getOrder()->getId(),
            '响应码' => $response->getCode(),
            '响应数据' => $response->getData()
        ]);
    }
}

PayPal的处理逻辑完全一致,只需要注入 PayPalLogger 并替换日志内容即可。

1.4 验证日志生成

配置完成后,执行以下命令刷新缓存和编译代码:

bin/magento setup:di:compile
bin/magento cache:flush

测试一笔Authorize.net支付,然后查看 var/log/payment/authorize_net.log,你会看到独立的支付日志,和系统主日志完全分离。


2. 将日志存储到远程位置

下面介绍两种常用的远程日志存储方案:Redis集中存储和远程Syslog服务器。

2.1 远程Redis存储

首先确保安装了Predis库(Magento默认可能已包含,若没有则执行):

composer require predis/predis

然后在 di.xml 中为支付Logger添加Redis处理器,以Authorize.net为例:

<!-- Authorize.net Redis日志处理器 -->
<type name="Monolog\Handler\RedisHandler">
    <arguments>
        <argument name="redis" xsi:type="object">
            <object name="Predis\Client">
                <arguments>
                    <argument name="parameters" xsi:type="array">
                        <item name="host" xsi:type="string">你的Redis主机地址</item>
                        <item name="port" xsi:type="number">6379</item>
                        <item name="password" xsi:type="string">Redis密码</item>
                        <item name="database" xsi:type="number">1</item> <!-- 用独立的数据库存储日志 -->
                    </argument>
                </arguments>
            </object>
        </argument>
        <argument name="key" xsi:type="string">magento:logs:authorize_net</argument>
        <argument name="level" xsi:type="number">Monolog\Logger::INFO</argument>
    </arguments>
    <alias name="authorizeNetRedisHandler"/>
</type>

<!-- 更新Authorize.net Logger,同时输出到本地文件和Redis -->
<type name="Vendor\PaymentLogger\Logger\AuthorizeNetLogger">
    <arguments>
        <argument name="name" xsi:type="string">authorize_net</argument>
        <argument name="handlers" xsi:type="array">
            <item name="stream" xsi:type="object">authorizeNetLogHandler</item>
            <item name="redis" xsi:type="object">authorizeNetRedisHandler</item>
        </argument>
    </arguments>
</type>

配置完成后,日志会同时写入本地文件和远程Redis服务器,根据你的实际Redis配置调整参数即可。

2.2 远程Syslog服务器

如果使用集中式Syslog服务器(比如Rsyslog),可以使用Monolog的 SyslogHandler

di.xml 中添加Syslog处理器:

<!-- Authorize.net Syslog日志处理器 -->
<type name="Monolog\Handler\SyslogHandler">
    <arguments>
        <argument name="ident" xsi:type="string">magento_authorize_net</argument>
        <argument name="facility" xsi:type="number">LOG_USER</argument>
        <argument name="level" xsi:type="number">Monolog\Logger::INFO</argument>
        <argument name="bubble" xsi:type="boolean">true</argument>
        <argument name="logopts" xsi:type="number">LOG_PID</argument>
    </arguments>
    <alias name="authorizeNetSyslogHandler"/>
</type>

<!-- 更新Logger,同时输出到本地文件和Syslog -->
<type name="Vendor\PaymentLogger\Logger\AuthorizeNetLogger">
    <arguments>
        <argument name="name" xsi:type="string">authorize_net</argument>
        <argument name="handlers" xsi:type="array">
            <item name="stream" xsi:type="object">authorizeNetLogHandler</item>
            <item name="syslog" xsi:type="object">authorizeNetSyslogHandler</item>
        </argument>
    </arguments>
</type>

然后配置服务器的Syslog守护进程(比如Rsyslog),添加转发规则:

:programname, isequal, "magento_authorize_net" @@远程Syslog服务器地址:514

重启Rsyslog服务后,日志就会自动转发到远程服务器。


3. 额外注意事项

  • 权限配置: 确保 var/log/payment 目录有正确的写入权限(推荐770或755,根据服务器环境调整)。
  • 日志级别: 可以修改Handler中的 level 参数控制日志粒度,比如 Monolog\Logger::DEBUG 记录详细调试信息,Monolog\Logger::ERROR 只记录错误日志。
  • 性能优化: 远程日志可能带来延迟,可考虑使用 BufferHandlerAsyncHandler 实现异步日志写入,避免影响支付流程性能。
  • 日志格式化: 可以添加 JsonFormatter 等格式化器,让远程日志更易解析和检索。

内容的提问来源于stack exchange,提问作者nitin sahu

火山引擎 最新活动