设置Yii的错误日志,可按照设置错误级别输入到日志或数据库中。

对yii\log\FileTarget做了重写。

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

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、数据表的结构如下:

表字段可按照yii2框架中的字段调整设置。

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;来源:https://www.icode9.com/content-2-569151.html

yii输出mysql查询日志_Yii2框架设置错误日志输出到日志或数据库相关推荐

  1. php 输出mysql查询结果_php如何输出mysql查询结果

    php输出mysql查询结果的方法:首先,用navicat创建一个新的数据库,并创建一个新的表表2::然后在表2中添加新数据,并使用[mysql_connect]函数与页面中的数据库建立连接:然后选择 ...

  2. php 输出mysql_php如何输出mysql查询结果

    php输出mysql查询结果的方法:首先用navicat新建数据库,并新建表table2:然后在table2中添加新数据,并在页面中用[mysql_connect]函数与数据库建立连接:接着选择要查询 ...

  3. yii mysql 查询 类型转换_yii2.0数据库查询修改等方法

    yii2.0学习有一段时间了,给大家分享一下一些简单的查询等如何操作. 查询:(这里最前面的Test是引用的模型名) Test::find()->all();此方法返回所有数据: Test::f ...

  4. yii mysql 查询 类型转换_Yii2.0 API改造(返回数据库对应字段数据类型)

    namespace common\ext;useYii;useyii\base\InvalidConfigException;useyii\base\NotSupportedException;use ...

  5. MySql 查询时 为NULL 设置默认值

    我们在查询MySql 数据库时,如果使用比较复杂的查询方式,查询结果有时候会为空(NULL). 大多数时候,我们会希望他有一个默认值. 对于这个默认值,一种办法是查询完成后用编程语言给他赋默认值. 然 ...

  6. mysql查询结果某个字段设置为固定值_MySQL使用select查询时,在查询结果中增加一个字段并指定固定值...

    假设需求是这样的: mysql> desc user; +-------+----------+------+-----+---------+----------------+ | Field ...

  7. php输出mysql查询结果_PHP简单获取数据库查询结果并返回JSON

    header("Content-type:text/html;charset=utf-8"); //连接数据库 $con = mysql_connect("localho ...

  8. php输出mysql查询,MySQL查询和PHP输出

    我有2个表,我想知道groupid = 1中有多少用户,并将该组中的所有成员打印到数组中. groups table userid groupid 1 1 2 1 3 1 4 2 5 2 users ...

  9. 黄聪:Wordpress程序Mysql查询导致CPU100%,页面错误增量飙高解决方案

    最近做的网站,访客一多,CPU就会飙到100%,找了网上很多解决方案,用了下面的方法进行优化: 1.mysql开启慢查询方法: 在my.ini的[mysqld]添加如下语句: log-slow-que ...

最新文章

  1. java实现将pdf变成一张图片在页面显示
  2. docker小技巧-清理未使用空间
  3. 机器学习之sklearn——聚类
  4. urllib2.HTTPError: HTTP Error 403: Forbidden的解决方案
  5. python 安装 pip,setuptools
  6. 【MFC两种视频图像採集方法】DirectShow与Opencv
  7. Linux-文件查找
  8. Python:if语句
  9. [转载] flutter开发桌面程序_在开始使用Flutter开发应用程序之前要了解的5条提示
  10. 如何将SWF的FLASH转成GIF动态图片呢.
  11. php edm 系统,edm.php · 那些年我们一起/fanwe - Gitee.com
  12. 云操作系统OpenStack 优势与问题并存
  13. andriod studio 卡在wating for target device to come
  14. 深入研究simulink建模与仿真之信号线上的几种不同的图标
  15. 微机原理和计算机组成原理一样吗_计算机组成原理(指令)
  16. 腾讯地图标注_在腾讯地图上标注店铺,只需要简单几步就搞定
  17. matlab中标幺值,标幺值概述
  18. [转载]学习 codota的使用
  19. Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day21】—— Linux命令
  20. 情人节翻译软件测试,情人节甜蜜制造机|互动装置干货精选

热门文章

  1. encodingaeskey java,消息体签名与加解密-开发者QA
  2. java怎么实现同步到微博功能_新浪微博信息站外同步的完整实现
  3. 花季少女竟然有个三年级老公??!
  4. 你的女神今日结婚了!!!你失恋了......
  5. 复工之后,如何让自己的时间更值钱
  6. php 身份认证服务,PHP的HTTP身份认证
  7. 大数据财税与python应用_大数据跟python
  8. android studio 创建.9文件,自己使用Android studio创建.9(点9)图片
  9. linux lua socket编程,CentOs 安装lua,luasocket
  10. JAVA中pin什么意思_java语言中的多态概述