Laravel 通过代理登录到 Slack
Laravel Logging to Slack via a Proxy
我已经将我的 Laravel 应用 运行 Laravel 5.7.5 PHP 框架配置为向 Slack 频道发送错误通知。我的 config/logging.php 文件的片段如下所示:
'channels' => [
'stack' => [
'driver' => 'stack',
'channels' => (env('APP_ENV') == 'production') ? ['single', 'slack'] : ['single'],
],
'single' => [
'driver' => 'single',
'path' => storage_path('logs/laravel.log'),
'level' => 'debug',
],
'daily' => [
'driver' => 'daily',
'path' => storage_path('logs/laravel.log'),
'level' => 'debug',
'days' => 7,
],
'slack' => [
'driver' => 'slack',
'url' => env('LOG_SLACK_WEBHOOK_URL'),
'username' => 'Laravel Log',
'emoji' => ':boom:',
'level' => 'error',
],
当我连接到 public 互联网(不是通过代理服务器)时,这工作正常,但我的生产服务器需要通过 Squid 代理服务器发送请求,并且请求超时.
如何为 Slack Webhook 指定代理服务器以确保我的请求通过代理服务器路由并发送到 Slack API?
我知道已经过去了很多时间,但我 运行 遇到了类似的问题,也许 material 找到的可能对某人有用。
根据库的源代码判断
https://github.com/Seldaek/monolog/blob/master/src/Monolog/Handler/SlackWebhookHandler.php
目前,当前实现无法指定代理。
但您可以定义自定义类型的记录器。
本文详细介绍了如何操作。
https://medium.com/binarcode/laravel-5-6-custom-monolog-channel-to-store-logs-in-mariadb-23da52f537e7
我是这样做的:
//config/logging.php
'default' => env('LOG_CHANNEL', 'custom'),
....
'custom' => [
'driver' => 'custom',
'via' => App\Extensions\SlackCustomLogger::class,
'level' => 'debug',
'url' => env('SLACK_WEBHOOK_URL'),
'username' => 'Laravel Log',
'emoji' => ':boom:',
],
...
<?php
namespace App\Extensions;
use Monolog\Logger;
class SlackCustomLogger
{
/**
* Create a custom Monolog instance.
*
* @param array $config
* @return \Monolog\Logger
*/
public function __invoke(array $config)
{
$logger = new Logger('custom');
$logger->pushHandler(new CustomSlackLogHandler(
$config['url'],
$config['channel'] ?? null,
$config['username'] ?? 'Laravel',
$config['attachment'] ?? true,
$config['emoji'] ?? ':boom:',
$config['short'] ?? false,
$config['context'] ?? true,
$config['level'] ?? 'debug'
));
return $logger;
}
}
<?php
namespace App\Extensions;
use Monolog\Handler\Curl\Util;
use Monolog\Handler\SlackWebhookHandler;
class CustomSlackLogHandler extends SlackWebhookHandler
{
protected function write(array $record)
{
$postData = $this->getSlackRecord()->getSlackData($record);
$postString = json_encode($postData);
$ch = curl_init();
$options = array(
CURLOPT_URL => $this->getWebhookUrl(),
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => array('Content-type: application/json'),
CURLOPT_POSTFIELDS => $postString
);
if(getenv('PROXY', false)) {
$options[CURLOPT_PROXY] = getenv('PROXY');
curl_setopt($ch, CURLOPT_PROXYPORT, getenv('PROXY_PORT'));
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_PROXYUSERPWD, getenv('PROXY_USERPWD'));
}
if (defined('CURLOPT_SAFE_UPLOAD')) {
$options[CURLOPT_SAFE_UPLOAD] = true;
}
curl_setopt_array($ch, $options);
Util::execute($ch);
}
}
我已经将我的 Laravel 应用 运行 Laravel 5.7.5 PHP 框架配置为向 Slack 频道发送错误通知。我的 config/logging.php 文件的片段如下所示:
'channels' => [
'stack' => [
'driver' => 'stack',
'channels' => (env('APP_ENV') == 'production') ? ['single', 'slack'] : ['single'],
],
'single' => [
'driver' => 'single',
'path' => storage_path('logs/laravel.log'),
'level' => 'debug',
],
'daily' => [
'driver' => 'daily',
'path' => storage_path('logs/laravel.log'),
'level' => 'debug',
'days' => 7,
],
'slack' => [
'driver' => 'slack',
'url' => env('LOG_SLACK_WEBHOOK_URL'),
'username' => 'Laravel Log',
'emoji' => ':boom:',
'level' => 'error',
],
当我连接到 public 互联网(不是通过代理服务器)时,这工作正常,但我的生产服务器需要通过 Squid 代理服务器发送请求,并且请求超时.
如何为 Slack Webhook 指定代理服务器以确保我的请求通过代理服务器路由并发送到 Slack API?
我知道已经过去了很多时间,但我 运行 遇到了类似的问题,也许 material 找到的可能对某人有用。
根据库的源代码判断 https://github.com/Seldaek/monolog/blob/master/src/Monolog/Handler/SlackWebhookHandler.php
目前,当前实现无法指定代理。
但您可以定义自定义类型的记录器。 本文详细介绍了如何操作。 https://medium.com/binarcode/laravel-5-6-custom-monolog-channel-to-store-logs-in-mariadb-23da52f537e7
我是这样做的:
//config/logging.php
'default' => env('LOG_CHANNEL', 'custom'),
....
'custom' => [
'driver' => 'custom',
'via' => App\Extensions\SlackCustomLogger::class,
'level' => 'debug',
'url' => env('SLACK_WEBHOOK_URL'),
'username' => 'Laravel Log',
'emoji' => ':boom:',
],
...
<?php
namespace App\Extensions;
use Monolog\Logger;
class SlackCustomLogger
{
/**
* Create a custom Monolog instance.
*
* @param array $config
* @return \Monolog\Logger
*/
public function __invoke(array $config)
{
$logger = new Logger('custom');
$logger->pushHandler(new CustomSlackLogHandler(
$config['url'],
$config['channel'] ?? null,
$config['username'] ?? 'Laravel',
$config['attachment'] ?? true,
$config['emoji'] ?? ':boom:',
$config['short'] ?? false,
$config['context'] ?? true,
$config['level'] ?? 'debug'
));
return $logger;
}
}
<?php
namespace App\Extensions;
use Monolog\Handler\Curl\Util;
use Monolog\Handler\SlackWebhookHandler;
class CustomSlackLogHandler extends SlackWebhookHandler
{
protected function write(array $record)
{
$postData = $this->getSlackRecord()->getSlackData($record);
$postString = json_encode($postData);
$ch = curl_init();
$options = array(
CURLOPT_URL => $this->getWebhookUrl(),
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => array('Content-type: application/json'),
CURLOPT_POSTFIELDS => $postString
);
if(getenv('PROXY', false)) {
$options[CURLOPT_PROXY] = getenv('PROXY');
curl_setopt($ch, CURLOPT_PROXYPORT, getenv('PROXY_PORT'));
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_PROXYUSERPWD, getenv('PROXY_USERPWD'));
}
if (defined('CURLOPT_SAFE_UPLOAD')) {
$options[CURLOPT_SAFE_UPLOAD] = true;
}
curl_setopt_array($ch, $options);
Util::execute($ch);
}
}