概述
直到现在,log4php仍用于日志输出,但是由于预期会收到Slack的通知,因此我将它替换为Monolog。
环境
CodeIgniter 3.1.10
PHP 7.2
安装Monolog
1 | $ composer require monolog/monolog |
可独立扩展日志核心类
CodeIgniter允许您通过在应用程序/核心中放置一堆来用您自己的扩展名替换默认核心类。
必须在独立扩展的核心类的类名和文件名前加上" MY_"。
这次我们将扩展日志核心类,因此该类的名称将为MY_Log。
应用程序/核心/MY_Log.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | <?php defined('BASEPATH') OR exit('No direct script access allowed'); use Monolog\Logger; use Monolog\Handler\RotatingFileHandler; use Monolog\Formatter\LineFormatter; class MY_Log extends CI_Log { protected $logger; public function __construct() { parent::__construct(); // Monologのチャンネルを作成 $this->logger = new Logger('log'); // 親クラスの設定を引き継ぎログファイル名を指定 $filename = $this->_log_path.'log.'.$this->_file_ext; // ログローテーションしてくれるハンドラーを使用 $rotate_handler = new RotatingFileHandler($filename); $rotate_handler->setFormatter(new LineFormatter("%datetime% [%level_name%] %message%\n")); $this->logger->pushHandler($rotate_handler); } /** * ログ出力 * @param string $level エラーレベル * @param string $msg メッセージ */ public function write_log($level, $msg) { // エラーレベルが「debug」「info」「error」であることを前提に実装 $this->logger->{$level}($msg); } } |
传递给
write_log的参数$ level是"调试","信息"和"错误"之一,因此按原样用作方法名。
确保在发生错误
时通知Slack
此外,如果错误级别为"错误",我也想通知Slack,所以我添加了它。
有几个用于通知Slack的处理程序,但是这次我们使用SlackWebhookHandler来使用Webhook进行通知。
获取Slack Webhook URL
从以下URL获取用于与Slack链接的Webhook URL。
https:// [您要通知的工作区名称] .slack.com / apps / A0F7XDUAZ--incoming-webhook-?next_id = 0
将配置添加到配置文件
将获取的Webhook URL等添加到配置文件中。
如果要在开发环境和生产环境之间更改通知目的地,最好将config.php放在开发和生产子目录中并对其进行描述,但是这次我将省略这一点。
应用程序/配置/ config.php
1 2 3 4 | $config['endpoint'] = 'https://hooks.slack.com/services/XXXXXXXXX/XXXXXXXXX/xxxxxXXxxXxXXxxXXXXXxx'; $config['username'] = 'エラー通知'; $config['icon'] = ':ghost:'; $config['channels'] = '#notice-error'; |
更改为也通知Slack
应用程序/核心/MY_Log.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | <?php defined('BASEPATH') OR exit('No direct script access allowed'); use Monolog\Logger; use Monolog\Handler\RotatingFileHandler; use Monolog\Handler\SlackWebhookHandler; use Monolog\Formatter\LineFormatter; class MY_Log extends CI_Log { protected $logger; public function __construct() { parent::__construct(); // Monologのチャンネルを作成 $this->logger = new Logger('log'); // 親クラスの設定を引き継ぎログファイル名を指定 $filename = $this->_log_path.'log.'.$this->_file_ext; // ログローテーションしてくれるハンドラーを使用 $rotate_handler = new RotatingFileHandler($filename); $rotate_handler->setFormatter(new LineFormatter("%datetime% [%level_name%] %message%\n")); $this->logger->pushHandler($rotate_handler); // 設定を取得 $config =& get_config(); // エラーの場合Slackにも通知する if (isset($config['slack_endpoint']) && '' !== $config['slack_endpoint']) { $slack_handler = new SlackWebhookHandler( $config['slack_endpoint'], isset($config['slack_channels']) ? $config['slack_channels'] : null, isset($config['slack_username']) ? $config['slack_username'] : null, false, isset($config['slack_icon']) ? $config['slack_icon'] : null, false, false, \Monolog\Logger::ERROR ); $slack_handler->setFormatter(new LineFormatter("%message%")); $this->logger->pushHandler($slack_handler); } } /** * ログ出力 * @param string $level エラーレベル * @param string $msg メッセージ */ public function write_log($level, $msg) { // エラーレベルが「debug」「info」「error」であることを前提に実装 $this->logger->{$level}($msg); } } |
当您执行
时,将收到这样的通知。
参考
https://qiita.com/ichi_system/items/ea07df5eef9763179c70
https://github.com/Seldaek/monolog
https://www.codeigniter.com/user_guide/