配置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
相关产品推荐
相关产品推荐

