Monolog를 사용하여 CodeIgniter 로그 내보내기

개요


지금까지 로그의 출력은log4php를 사용했지만, Slack에 대한 알림을 겨냥하여Monolog를 교체해 보았습니다.

컨디션


CodeIgniter 3.1.10
PHP 7.2

Monolog 설치

$ composer require monolog/monolog

혼자 확장 로그 코어 클래스


CodeIgniter에서 응용 프로그램/core에서 파이프라인을 설정하면 기본 핵심 클래스를 혼자 확장하는 것으로 대체할 수 있습니다.
자신이 확장한 핵심 클래스의 클래스나 파일 이름을 접두어로 'MY'탭
이번에는 로그의 핵심 레벨을 확장해야 하기 때문에 클래스 이름은 MY입니다.로그가 됩니다.
application/core/MY_Log.php
<?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_로그에 전달된 매개 변수는 'debug' 'info''error '중의 하나이기 때문에 방법 이름으로 직접 사용합니다.

오류가 발생한 경우에도 슬랙에 알림


또 오류 레벨이'error'인 경우에도 슬랙에게 알리도록 해 추가했다.
슬랙을 알리기 위해 여러 개의 프로세서를 준비했는데, 이번에는 웹훅 알림을 사용하는 슬랙 웹훅 핸들러를 사용했다.

Slack의 Webhook URL 가져오기


다음 URL에서 Slack과 협력하는 Webhook URL을 가져옵니다.
http:/[알려주고 싶은 작업공간 이름].slack.com/apps/A0F7XDUAZ--incoming-webhook-?next_id=0

config 파일에 설정 추가


가져온 Webhook URL 등을 설정 파일에 추가합니다.
개발 환경과 공식 환경에서 알림 목적지를 바꾸면 개발자와 제품 디렉터리에 config가 있습니다.가장 좋은 것은 php를 설정해서 기술하는 것이다. 이번에는 이 점을 생략하자.
application/config/config.php
$config['endpoint'] = 'https://hooks.slack.com/services/XXXXXXXXX/XXXXXXXXX/xxxxxXXxxXxXXxxXXXXXxx';
$config['username'] = 'エラー通知';
$config['icon'] = ':ghost:';
$config['channels'] = '#notice-error';

알림 Slack으로 변경


application/core/MY_Log.php
<?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/

좋은 웹페이지 즐겨찾기