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

设置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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/312297.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BeetleX网关非法Url请求拦截插件

一旦网站部署到互联网上&#xff0c;就会受到一些非法的请求&#xff0c;而这些请求的Url都是一些特定的路径或带上一些无关请求的字符用于探测一些服务存在的问题&#xff1b;还有这些请求会落到日志中&#xff0c;导致日志臃肿和转发到后台服务带来处理上的损耗。为了应对拦截…

C++继承同名静态成员处理

问题&#xff1a;继承中同名的静态成员在子类对象如何访问&#xff1f; 静态成员和非静态成员出现同名&#xff0c;处理方式一致 1.访问子类同名成员 直接访问即可 2.访问父类同名成员 需要加作用域 首先我们先介绍一下静态成员属性的特点&#xff1a; 1.编译阶段分配内存 2…

java安装版本哪种好_我怎么知道我安装了哪个版本的Java?

问题描述我想开始玩java(最终到了可以为android或web编写基本小程序的地步)&#xff0c;但是我已经在我的计算机上(从过去的实验中)弄糟了java。我不确定我拥有哪个版本的Java&#xff0c;并且想知道是否有命令查看已安装且处于活动状态的Java版本。另外&#xff0c;哪个版本效…

UnitTest in .NET 系列文章目录

Photo &#xff1a;.NET单元测试的艺术文 | Edison Zhou这几天陆陆续续更新了UnitTest in .NET这个系列的文章&#xff0c;现将其总结成一个小目录。此外&#xff0c;特别推荐阅读Roy Osherove的《单元测试的艺术》一书&#xff0c;此文也是该书的精华内容的学习笔记总结。文章…

C++多继承语法

C允许一个类继承多个类 多继承可能会引发父类中有同名成员出现&#xff0c;需要加作用域区分 C实际开发中不建议用多继承 语法&#xff1a;class 子类 : 继承方式 父类1 , 继承方式 父类2 … 代码如下&#xff1a; #include <iostream> using namespace std;//父类 …

java蝇量模式_Head First设计模式——蝇量和解释器模式

蝇量蝇量模式&#xff1a;如果让某个类的一个实例能用来提供许多“虚拟实例”&#xff0c;就使用蝇量模式。在一个设计房子的平台中&#xff0c;周围要加上一些树&#xff0c;树有一个坐标XY坐标位置&#xff0c;而且可以根据树的年龄动态将自己绘制出来。如果我们创建许多树之…

如何运用领域驱动设计 - 聚合

概述DDD实战与进阶 - 值对象如何运用DDD - 实体如何运用领域驱动设计 - 领域服务在前几篇的博文中&#xff0c;我们已经学习到了如何运用实体和值对象。随着我们所在领域的不断深入&#xff0c;领域模型变得逐渐清晰&#xff0c;我们已经建立了足够丰富的实体和值对象。但随着实…

C++菱形继承

菱形继承概念&#xff1a; 1.两个派生类继承同一个基类 2.又有某个类同时继承着两个派生类 这种继承被称为菱形继承&#xff0c;或者钻石继承 举个例子&#xff1a; 菱形继承问题&#xff1a; 1.羊继承了动物的数据&#xff0c;鸵同样继承了动物的数据&#xff0c;当羊驼使…

ASP.NET Core Web程序托管到Windows 服务

前言在 .NET Core 3.1和WorkerServices构建Windows服务 我们也看到了,如何将workerservices构建成服务,那么本篇文章我们再来看看如何将web应用程序托管到我们的服务中.将WEB应用作为服务运行我们需要将我们的WEB应用程序编译成exe文件&#xff0c;在ASP.NETCore中其实这是一个…

运行wordcount.java_运行hadoop wordcount程序

我正在通过以下michael-noll教程学习hadoop . 当我试图通过运行 hadoop jar hadoop-examples-1.2.1.jar wordcount tmp/Files tmp/Output 运行wordcount示例时&#xff0c;我收到以下错误&#xff1a;13/11/10 18:09:42 INFO ipc.Client&#xff1a;重试连接到服务器&#xff1…

EntityFramework Core动态加载模型,我们要知道些什么呢?

这篇文章源于一位问我的童鞋&#xff1a;在EntityFramework Core中如何动态加载模型呢&#xff1f;在学习EntityFramwork时关于这个问题已有对应童鞋给出答案&#xff0c;故没有过多研究&#xff0c;虽然最后解决了这位童鞋提出的问题&#xff0c;但是当我再次深入研究时&#…

C++多态的基本语法与原理剖析

多态分为两类 1.静态多态&#xff1a;函数重载和运算符重载属于静态多态&#xff0c;复用函数名 2.动态多态&#xff1a;派生类和虚函数实现运行时多态 静态多态和动态多态区别&#xff1a; 1.静态多态的函数地址早绑定&#xff0c;编译阶段确定函数地址 2.多态多态的函数地址…

从零开始开发 VS Code 插件之 Translator Helper

本文目录Translator Helper 介绍开发概述创建第一个VS Code Extension需求分析操作文本调用Google Translation API实现核心功能配置命令插件配置测试插件打包插件发布插件CI/CDIcon及README小结Translator Helper 介绍 微软 Docs 网站上线之后&#xff0c;我发现很多中文内容是…

java printf 版本_java – PrintStream类型中的printf(String,Object ...

为什么通过简单调用printf会出现以下编译错误&#xff1f;我的代码&#xff1a;import java.util.Scanner;public class TestCodeBankAccInputs{public static void main(String[] args){String displayName "Bank of America Checking";int balance 100;System.ou…

C++string容器-构造函数

本质&#xff1a; string是C风格的字符串&#xff0c;而string本质上是一个类 string和char区别&#xff1a; 1.char是一个指针 2.string是一个类&#xff0c;类内部封装了char*&#xff0c;管理这个字符串&#xff0c;是一个char*型的容器 string构造函数原型&#xff1a; 1…

【实战 Ids4】║ 又一个项目迁移完成(MVC)

迎周一&#xff0c;腊月十九&#xff0c;小年倒计时新年还有两周时间就要到了&#xff0c;学习可不能停&#xff0c;这几天一直在加班调休&#xff0c;周末也如此&#xff0c;不过也是趁着半夜凌晨的时间&#xff0c;继续迁移我的项目到IdentityServer4统一认证授权中心Blog.Id…

C++string容器-赋值操作

功能描述&#xff1a; 给string字符串进行赋值 代码如下&#xff1a; #include <iostream> using namespace std; #include <cstring>void test01() {string str1;str1 "hello world";cout << "str1 " << str1 << endl;…

C++生成随机数

C中生成随机数常用这两个函数&#xff1a; rand()和srand() rand()函数&#xff0c;生成一个范围在[0,RAND_MAX]的随机数&#xff0c;RAND_MAX的值为32767 其中RAND_MAX定义在cstdlib头文件中。 #include <iostream> using namespace std; #include <cstdlib>in…

JAVA解决生产消费者_Java常用三种方式解决生产者消费者问题(详细)

package test;/*** Synchronized 版本解决生产者消费者* wait() / notify()方法*/import java.util.LinkedList;import java.util.Queue;public class ProducerAndConsumerForSynchronized {// 1. 先定义最大生产长度private final int MAX_SIZE 10;// 2.定义储存队列private …

为什么说云原生会成为未来企业技术变迁的趋势

云原生是当下的热点话题&#xff0c;但是很多人对云原生有很多误解&#xff0c;特别是传统产业物联网或工控、物联网行业对云原生显得"后知后觉"。与其在这里说是预测&#xff0c;不如说是现在进行时&#xff0c;只是由于传统产业本身的技术包袱和组织个人认识程度差…