Yii2 frame is provided to the error log or database log output

Yii Setting error log, the log may be input to the database according to the settings or error level.
For yii \ log \ FileTarget done a rewrite.

1、设置common/config/main.php
$db = require(__DIR__ . '/db.php');
return [
    'vendorPath' => dirname(dirname(__DIR__)) . '/vendor',
    'bootstrap' => ['log'],
    'components' => [
        'cache' => [
            'class' => 'yii\caching\FileCache',
        ],
        'db' => $db,
        'log' => [
            'targets' => [
                [
                    'class' => 'yii\log\FileTarget',
                    'levels' => ['error', 'warning', 'info'],
                ],
                [
//                    'class' => 'yii\log\FileTarget',
                    'class' => 'app\common\components\FileTarget',
                    'levels' => ['error'],
                    'logFile' => '@runtime/logs/error.log',
                ],//日志入库
            ],
        ],
    ],
    'timeZone' => 'Asia/Shanghai',
];

2、app\common\components\FileTarget

<?php
 namespace app\common\components;

 use yii\helpers\VarDumper;
 use yii\log;

 class FileTarget extends log\FileTarget
 {
     public function export()
     {
        parent::export(); // TODO: Change the autogenerated stub
         //调用接口将数据入库  默认是收集错误日志
         if (empty(\Yii::$app->params['errorLog']['switch'])) {//设置参数是否收集错误日志

            $flag = false;
            if (empty($_SERVER['DOCUMENT_ROOT'])) {
                $projectName = '';
                $entrance = 'console';
                $flag = true;
            } else {
                $document_root = explode('/', $_SERVER['DOCUMENT_ROOT']);
                $projectName = $document_root[count($document_root) - 3];//项目名称
                $entrance = $document_root[count($document_root) - 2];//项目入口
            }

            $params = $_POST ?: $_GET;
            $errList = [];
            foreach ($this->messages as $message) {
                list($text, $level, $category, $timestamp) = $message;
                if ($level <> 4) {
                    if (!is_string($text)) {
                        // exceptions may not be serializable if in the call stack somewhere is a Closure
                        if ($text instanceof \Throwable || $text instanceof \Exception) {
                            $text = (string)$text;
                        } else {
                            $text = VarDumper::export($text);
                        }
                    }

                    if ($flag) {
                        $dir1 = '/var/www/html/';
                        $start = strpos($text, $dir1);
                        if (!$start) {
                            $dir1 = '/disk/html/';
                            $start = strpos($text, $dir1);
                            $project = substr($text, $start + strlen($dir1), 50);
                            $project = explode('/', $project);
                            $projectName = $project[0];

                        } else {
                            $project = substr($text, $start + strlen($dir1), 50);
                            $project = explode('/', $project);
                            $projectName = $project[0];
                        }
                    }

                    $text = $text . "\n" . "params:" . json_encode($params);
                    $errType = 'error';
                    if (stripos($category, 'db')) {
                        $errType = 'db';
                    } else if (stripos($text, 'Redis')) {
                        $errType = 'redis';
                    }
                    $item = [];
                    $item[] = empty($projectName) ? '0' : $projectName;//项目
                    $item[] = empty($entrance) ? '0' : $entrance;//入口
                    $item[] = empty($_SERVER['SERVER_NAME']) ? '0' : $_SERVER['SERVER_NAME'];
                    $item[] = $level;
                    $item[] = $category;
                    $item[] = $timestamp;
                    $item[] = $this->getMessagePrefix($message);
                    $item[] = IPUtils::get_local_ip();
                    $item[] = empty($_SERVER['REQUEST_URI']) ? '0' : $_SERVER['REQUEST_URI'];
                    $item[] = $errType;
                    $item[] = $text;//错误信息
                    $errList[] = $item;
                }
            }
            //请求接口入库
            $this->collectErrorLog($errList);
        }
    }

    /**
     * @param $data
     * @return mixed
     * 错误日志入库
     */
    private function collectErrorLog($data)
    {
        if (empty(\Yii::$app->params['errorLog']['logApiDomain'])) {
            if (YII_ENV == 'local' || YII_ENV == 'dev') {
                $url = 'http://dev.api.log.3ttech.cn/inner/collect-error-log?';
            } else {
                $url = 'http://api.log.3ttech.cn/inner/collect-error-log?';
            }
        } else {
            $url = \Yii::$app->params['errorLog']['logApiDomain'] . '/inner/collect-error-log?';
        }
        $requestBody = [
            'data' => $data,
        ];
        $url .= http_build_query($requestBody);
        $response = json_decode(AHelper::curl_get($url), true);
        return $response;
    }
}

3, the structure of the data table is as follows:
Field field may be provided in accordance with the adjustment yii2 frame.

CREATE TABLE `t_user_logs` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `project` varchar(100) NOT NULL DEFAULT '' COMMENT '项目名称',
  `entrance` varchar(20) NOT NULL DEFAULT '' COMMENT '入口',
  `address` varchar(50) NOT NULL DEFAULT '' COMMENT '访问域名',
  `level` varchar(200) NOT NULL DEFAULT '' COMMENT '错误级别',
  `category` varchar(200) NOT NULL DEFAULT '' COMMENT '类别',
  `log_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '日志时间',
  `prefix` varchar(200) NOT NULL DEFAULT '' COMMENT '前缀',
  `suffix` varchar(200) NOT NULL DEFAULT '' COMMENT '报错服务器ip',
  `request_uri` varchar(100) NOT NULL DEFAULT '' COMMENT '请求路由',
  `errType` varchar(20) NOT NULL DEFAULT '4' COMMENT '错误类型',
  `message` text NOT NULL COMMENT '消息',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=100001 DEFAULT CHARSET=utf8;

Guess you like

Origin blog.51cto.com/11315052/2451770