Tương tác Phalcon với Slack để logger

Việc ghi lại log của mỗi hệ thống là điều rất cần thiết và nên làm. Nó không chỉ giúp ta dễ dàng nhận ra lỗi ở một thời điểm nhất định, mà còn giúp chúng ta phản hồi một cách nhanh chóng tới sự cố đó giúp cho dịch vụ chúng ta uptime 100%:)

Để làm điều đó thì bạn phải nhận tức thì những lỗi đó thông qua email, hay một dịch vụ nào đó trong bài viết này tôi sẽ hướng dẫn các bạn cách tương tác Slack với PhalconPHP để nhận loggers tức thời.

Slack là gì

Nhìn bề ngoài, Slack cũng như Skype, cũng chỉ là một công cụ chat. Như vậy Slack tuyệt vời hơn ở chỗ nào?

  • Ổn định hơn: khác với Skype đôi khi bị chập chờn, nhất là trên di động, Slack chạy ổn định và nhanh hơn.

  • Chạy tốt hơn trên mobile: app của Slack trên mobile (iOS/Android) chạy ít tốn pin hơn Skype cũng như đồng bộ với app trên desktop chính xác hơn.

  • Notification thông minh hơn: với Skype chỉ có nhận tất cả message hoặc không. Với Slack, bạn có thể tùy chọn để nhận được message theo group hoặc chỉ khi bị “mention”.

  • Tích hợp tốt hơn với các công cụ khác: rất nhiều công cụ và hệ thống hiện có được tích hợp sẵn với Slack, nhất là Trello – công cụ quản lý project chính tại SSS. Do đó Slack và Trello là cặp đôi hoàn hảo.

Ngoài những lợi ích trên, cái lợi lớn nhất của Slack chính là giúp… tiết kiệm email. Nếu bạn muốn xem chi tiết có thể xem trên siliconstraits

Phalcon là gì

Phalcon là một mã nguồn mở, có đầy đủ tính năng của một mô hình MVC và nó được viết bằng ngôn ngữ C, sau đó build thành file .DLL và tích hợp vào danh sách Extensions của Apache, vì vậy nó có tính performance cao, hay có thể nói tốc độ của nó sẽ nhanh hơn các Framwork khác.

Bạn có thể xem bài viết Giới thiệu Phalcon PHP

Chúng tôi giả sử bạn có một chút kiến thức căn bản về Phalcon PHP nếu không thì cũng không sao miễn là bạn biết PHP thì có thể hiểu được bài viết này

Tích hợp thư viện Logger

Thì mặc định Phalcon PHP đã có logger rồi nhưng nó chưa có hỗ trọ gửi loggers Slack do đó chúng tôi sẽ dùng một thư viện có tên là monolog thư viện này khá là ngon, nhìn số lượng star là 5,845 là biết rồi, để sử dụng nó chỉ cần cài đặt thông qua composer.

[code lang=text] composer require monolog/monolog

[/code]

sau đó chúng ta sẽ tạo một class với tên là Slack.php với nội dung như sau.

[php] <?php
namespace Gsviec\Utils;

use Monolog\Logger;
use Monolog\Handler\GelfHandler;
use Gelf\MessagePublisher;
use Monolog\Handler\SlackHandler;
use Phalcon\Di;

/**
* Class to configure and return a Monolog to Slack
*
* @return \Monolog\loger
*/
class Slack
{

/**
* Method to return the Monolog to slack
*
* @return Monolog\Logger
*/
public static function run($message, $type)
{
$config = Di::getDefault()->get(‘config’);
$token = $config->slack->token;
$channel = $config->slack->channel;

$slack = new SlackHandler($token, $channel, ‘Bot Logger’);
$slack->setLevel($type);
$log = new Logger(‘Gsviec’);

$log->pushHandler($slack);

$log->$type($message);
}
}

[/php]

nếu bạn nào có làm Phalcon thì dễ dàng hiểu đoạn code trên làm gì, 3 dòng code đầu tiên là nó lấy thông tin cấu hình từ Slack Token, bạn cần phải có quyền admin của tài khoản Slack đó mới tạo được tham số token đó, để tạo nó bạn chỉ cần truy câp thông qua đường dẫn sau https://api.slack.com/token, cơ bản bạn sẽ có như hình bên dưới:

cơ bản bạn sẽ có 2 tham số sau khi tạo token ở trên đó là chanel mà bạn muốn nhận tin nhắn và token api.

[code lang=text] 'slack' => [
'channel' => 'deploy',
'token' => 'xoxp-11450792213-11455185121-148054-xxxxxxxxxxxxx
] [/code]

các đoạn code còn lại là của thư viện monolog, để hiểu cách làm việc của nó thì bạn có thể xem mã nguồn SlackHandler.

tiếp theo chúng ta sẽ tạo một class với tên là LoggerSlack.php, class này có nhiệm vụ sử dụng class ở trên để gửi logger qua Slack đồng thời kế thừa những tính năng logger có của PhalconPHP.

[php]

<?php
namespace Gsviec\Utils;

use Phalcon\Logger as Logger;
use Phalcon\Logger\Exception as LoggerException;
use Phalcon\Logger\Adapter\File as FileLogger;

require ROOT_DIR . ‘/vendor/autoload.php’;

/**
*
* Adapter to save logs into multiple log files based on their level.
*
*/
class LoggerSlack extends FileLogger
{
/**
* Path to the directory where log files will be saved. No trailing slash.
*
* @var string
*/
protected $path;

/**
* Adapter options.
*
* @var array
*/
protected $options = [];

/**
* Class constructor.
*
* @param string $path Directory path for saving the log files.
* @param array $options The following options are available:
* – extension (string) Extension for all log files.
* – prefix (string) Name prefix for all log files
* @throws \Phalcon\Logger\Exception
*/
public function __construct($path, array $options = [])
{
parent::__construct($path, $options);
}

/**
* Writes the log to the file itself
*
* @param string $message
* @param integer $type
* @param integer $time
* @param array $context
* @throws \Phalcon\Logger\Exception
*/
public function logInternal($message, $type, $time, array $context = [])
{
parent::logInternal($message, $type, $time, $context = []);

Slack::run($message, $this->getTypeString($type));

return;
}
protected function getTypeString($type)
{
switch ($type) {
case Logger::EMERGENCY:
case Logger::EMERGENCE:
case Logger::CRITICAL:
// emergence, critical
return ‘critical’;
case Logger::ALERT:
case Logger::ERROR:
// error, alert
return ‘error’;
case Logger::WARNING:
// warning
return ‘warning’;
case Logger::NOTICE:
case Logger::INFO:
// info, notice
return ‘info’;
case Logger::DEBUG:
case Logger::CUSTOM:
case Logger::SPECIAL:
default:
// debug, log, custom, special
return ‘debug’;
}
}
}
[/php]

hãy để tôi giải thích dòng code

[code lang=text] ###
require ROOT_DIR . '/vendor/autoload.php';

[/code]

tức là nó nạp thư viện monolog, còn hàm logInternal là một hàm của PhalconPHP nó sẽ thực thi khi bạn gọi một service logger mà bạn định nghĩa trong ứng dụng Phalcon của bạn. Cuối cùng là hàm run của Slack hàm này nó sẽ gửi logger qua ứng dụng Slack

[code lang=text] ###
Slack::run($message, $this->getTypeString($type));

[/code]

Sử dụng

Để sử dụng nó thì bạn có 2 cách một là khởi tạo trực tiếp class LoggerSlack.php nhưng trong PhalconPHP ta không làm vậy mà ta sẽ khai báo nó với một service đó có thể dùng bất cứ đâu, chỉ cần khai báo như sau:

[code lang=text] […]

/**
* The logger component
*/
$di->set(
'logger',
function () use ($di) {
$logger = ROOT_DIR. 'logs/' . date('Y-m-d') . '.log';

return new \Gsviec\Utils\LoggerSlack($logger, ['model' => 'a+']);
},
true
);

[/code]

bạn có thể xem ví dụ cụ thể service.php trên github tại đây

Cuối cùng bạn chỉ việc dùng nó, tôi giả sử bạn đang ở trong controller của một app Phalcon thì chỉ việc gọi như sau để test

[code lang=text] $this->logger->error('Test error');
$this->logger->info('Test info');

[/code]

Hình dưới đây là kết quả trong dự án của tôi đã làm

Kết luận

Trên đây chúng tôi đã hướng bạn cách cơ bản tích hợp Slack với Phalcon PHP để theo dõi logger, bạn có thể áp dụng nó cho bất cứ Framework PHP nào bạn muốn

Nếu bạn nào có dùng nó rồi hãy chia sẽ cảm nghĩ của bạn bên dưới. Thanks!

Leave a Reply

Your email address will not be published. Required fields are marked *