You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

配置PHP/Symfony的Sentry:将事件记录到本地文件而非直接发送至Sentry

PHP + 本地日志文件 + Fluentbit 转发至 Sentry 配置方案

1. PHP端配置:将Sentry事件写入本地文件

修改PHP项目的Sentry集成逻辑,禁用实时API发送,改为将事件序列化为JSON格式写入本地日志文件。

方案一:自定义Sentry传输类

<?php
require __DIR__ . '/vendor/autoload.php';

// 初始化Sentry客户端,替换为你的DSN
$client = new Sentry\Client([
    'dsn' => 'YOUR_SENTRY_DSN',
    'transport' => function () {
        // 自定义传输:将事件写入本地日志文件
        return new class implements Sentry\Transport\TransportInterface {
            public function send(Sentry\Event $event): void
            {
                $logPath = '/var/log/sentry/php_events.log';
                // 确保日志目录存在
                if (!is_dir(dirname($logPath))) {
                    mkdir(dirname($logPath), 0755, true);
                }
                // 将事件转为JSON并追加写入
                $jsonEvent = json_encode($event->toArray(), JSON_UNESCAPED_SLASHES);
                file_put_contents($logPath, $jsonEvent . PHP_EOL, FILE_APPEND | LOCK_EX);
            }

            public function close(): void {}
        };
    },
]);

// 绑定客户端到全局Hub
Sentry\SentrySdk::getCurrentHub()->bindClient($client);

// 测试示例:捕获异常
try {
    throw new Exception('Test exception for file-based Sentry logging');
} catch (Exception $e) {
    Sentry\captureException($e);
}

方案二:结合Monolog实现日志写入

如果项目已使用Monolog,可通过格式化Sentry事件后写入文件:

<?php
require __DIR__ . '/vendor/autoload.php';

use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Monolog\Formatter\JsonFormatter;
use Monolog\Handler\SentryHandler;

// 初始化Sentry(仅用于事件格式化,禁用自动发送)
Sentry\init([
    'dsn' => 'YOUR_SENTRY_DSN',
    'send_default_pii' => true,
    'transport' => function () {
        return new class implements Sentry\Transport\TransportInterface {
            public function send(Sentry\Event $event): void {}
            public function close(): void {}
        };
    },
]);

// 创建Monolog实例
$logger = new Logger('sentry_php');

// 配置文件处理器:写入JSON格式日志
$streamHandler = new StreamHandler('/var/log/sentry/php_events.log', Logger::ERROR);
$streamHandler->setFormatter(new JsonFormatter());
$logger->pushHandler($streamHandler);

// 配置Sentry处理器:将日志转为Sentry兼容格式
$sentryHandler = new SentryHandler(Sentry\SentrySdk::getCurrentHub()->getClient());
$sentryHandler->setFormatter(new Monolog\Formatter\SentryFormatter());
$logger->pushHandler($sentryHandler);

// 测试日志记录
$logger->error('Test application error', ['user_id' => 123, 'request_uri' => $_SERVER['REQUEST_URI']]);

2. Fluentbit配置:读取日志并转发至Sentry

编辑Fluentbit主配置文件/etc/fluentbit/fluentbit.conf,添加以下配置:

[SERVICE]
    Flush        1
    Log_Level    info

[INPUT]
    Name          tail
    Path          /var/log/sentry/php_events.log
    Tag           sentry.php
    Parser        json
    DB            /var/log/fluentbit/sentry_php.db
    Mem_Buf_Limit 5MB
    Skip_Long_Lines On

[FILTER]
    Name          modify
    Match         sentry.php
    # 移除Fluentbit自动添加的冗余字段(可选)
    Remove        _time
    Remove        _tag

[OUTPUT]
    Name          http
    Match         sentry.php
    Host          oXXXXXX.ingest.sentry.io  # 替换为你的Sentry ingest域名(从DSN中提取)
    Port          443
    URI           /api/YOUR_PROJECT_ID/envelope/  # 替换为你的Sentry项目ID
    Format        json
    TLS           On
    TLS.Verify    On
    Header        Authorization "Bearer YOUR_SENTRY_AUTH_TOKEN"  # 替换为有权限的Sentry Token

关键参数说明

  • Host:从Sentry DSN中提取,例如DSN为https://xxx@o12345.ingest.sentry.io/67890,则Host为o12345.ingest.sentry.io
  • URI:替换为你的项目ID,格式为/api/{PROJECT_ID}/envelope/
  • Authorization Token:在Sentry后台创建具有event:write权限的Internal Integration,或直接使用DSN作为Header值:Header Authorization "DSN YOUR_SENTRY_DSN"

3. 运维与权限配置

  • 确保PHP进程对日志目录有写入权限:
    mkdir -p /var/log/sentry
    chown www-data:www-data /var/log/sentry
    chmod 755 /var/log/sentry
    
  • 配置日志轮转避免磁盘溢出,创建/etc/logrotate.d/sentry_php:
    /var/log/sentry/php_events.log {
        daily
        missingok
        rotate 7
        compress
        delaycompress
        notifempty
        create 644 www-data www-data
    }
    
  • 重启Fluentbit使配置生效:
    systemctl restart fluent-bit
    

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 14:38:13