YII2中日志的配置与使用
YII2中给我们提供了非常方便的日志组件,只需要简单配置一下就可以使用。
我们在config/web.php中配置如下:
return [
//log必须在bootstrap期间就被加载,便于及时调度日志消息到目标
'bootstrap' => ['log'], 'components' => [
'log' => [
//消息跟踪级别,设置yii\log\Dispatcher::traceLevel属性
//YII_DEBUG开启时,日志消息被记录时,追加最多3个调用堆栈信息
'traceLevel' => YII_DEBUG ? 3 : 0,
//日志目标,可定义多个
'targets' => [
[
//日志处理器类
'class' => 'yii\log\FileTarget',
//日志记录的级别
'levels' => ['error', 'warning'],
//定义日志文件
'logFile' => '@runtime/logs/test.log',
],
],
],
],
];
通过下面5个方法,来写入我们自已的日志
//跟踪
Yii::trace('我是一条跟踪');
//消息
YII::info('我是一条消息');
//调试
YII::debug('我是一条调试');
//警告
YII::warning('我是一条警告');
//错误
YII::error('我是一条错误');
注意我们上面定义日志的levels为['error', 'warning'],所以日志只会记录这两个级别的信息。
有些时候我们并不希望把所有日志写在一起,我们会根据不同模块来写日志,这样以便区分,这就需要用到日志的分类了。
重新配置config/web.php如下:
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
//日志处理器类,这里我改用数据库存日志了
'class' => 'yii\log\DbTarget',
//日志记录的级别
'levels' => ['error', 'warning'],
//追加上下文信息,默认YII会包含PHP全局变量,这里我们不需要,设为空。
'logVars' => [],
//定义分类
'categories' => ['db'],
],
[
//日志处理器类,这里我改用数据库存日志了
'class' => 'yii\log\DbTarget',
//日志记录的级别
'levels' => ['error', 'warning'],
//追加上下文信息,默认YII会包含PHP全局变量,这里我们不需要,设为空。
'logVars' => [],
//定义分类
'categories' => ['pay'],
],
],
],
通过如下方法,添加我们的日志
//警告
YII::warning('我是一条数据库警告', 'db');
//错误
YII::error('我是一条数据库错误', 'db'); //警告
YII::warning('我是一条支付警告', 'pay');
//错误
YII::error('我是一条支付错误', 'pay');
由于上面的配置我们使用了DbTarget,我们还需要添加一张日志表,用于记录我们的日志,进入项目目录。运行如下命令:
yii migrate --migrationPath=@yii/log/migrations
当然categories我们也可以指定为YII的类
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
[
//日志处理器类,这里我改用数据库存日志了
'class' => 'yii\log\DbTarget',
//日志记录的级别,这里演示设为info
'levels' => ['info'],
//定义分类
'categories' => ['yii\db\*'],
],
],
],
然后我们操作一下数据库,看是否日志记录了。
<?php namespace app\controllers; use YII;
use yii\db\Query;
use yii\web\Controller; class TestController extends Controller
{
public function actionTest()
{
$data = (new Query())->from('{{%user}}')
->where('id=:id', [':id' => '1'])
->all(); var_dump($data);
}
}
日志消息的格式化,我们可以自定义日志的前缀。
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
[
//日志处理器类,这里我改用数据库存日志了
'class' => 'yii\log\DbTarget',
'levels' => ['error', 'warning'],
//定义分类
'categories' => ['db'],
//定义前缀
'prefix' => function($message) {
$uid = !empty(YII::$app->user->id) ? YII::$app->user->id : '-';
$mid = !empty(YII::$app->module->id) ? YII::$app->module->id : '-';
$cid = !empty(YII::$app->controller->id) ? YII::$app->controller->id : '-';
$aid = !empty(YII::$app->controller->action->id) ? YII::$app->controller->action->id : '-';
return "[{$uid}][{$mid}/{$cid}/{$aid}]";
},
],
],
],
使用如下代码,记录日志,查看效果
YII::warning('我是警告!!!', 'db');
YII::error('我是错误!!!', 'db');
由于没有登陆和分模块,所以没获取到用户ID和模块ID,不过控制器ID和方法ID都获取到了。
消息的刷新和导出
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
//消息被存放在一个数组里,积累到一定数量,才会被刷新到日志target
//通过flushInterval设置消息刷新到日志target的数量
'flushInterval' => 100,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
[
//日志处理器类,这里我改用数据库存日志了
'class' => 'yii\log\DbTarget',
//当消息刷新到日志对象时,并不会立即导出,只有累积到一定数量才会导出
//通过exportInterval来设置这个导出数量
'exportInterval' => 100,
'levels' => ['error', 'warning'],
//定义分类
'categories' => ['db'],
],
],
],
有人会问YII2设置flushInterval和exportInterval的作用是什么,因为在一些系统中日志的操作会很频繁,如果频繁的读取文件或数据库来写日志,会造成严重的IO消耗,降低系统性能,这也是YII2的一个优化吧。
当然有些时候一些长时间在控制台运行的程序,需要立即显示日志,那么可以通过如下配置:
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'flushInterval' => 1,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
[
'class' => 'yii\log\FileTarget',
'exportInterval' => 1,
'levels' => ['error', 'warning'],
//定义分类
'categories' => ['db'],
],
],
],
将flushInterval和exportInterval分别设为1。
有些时候我们需要人为的开启和关闭某些日志目标,这时就需要我们为每个日志目标设个键,以区分。
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
'pay' => [
'class' => 'yii\log\DbTarget',
'levels' => ['error', 'warning'],
'categories' => ['pay'],
],
'db' => [
'class' => 'yii\log\DbTarget',
'levels' => ['error', 'warning'],
'categories' => ['db'],
],
],
],
然后通过如下,进行开启和关闭:
//关闭
Yii::$app->log->targets['db']->enabled = false;
//开启
Yii::$app->log->targets['db']->enabled = true;
YII2中日志的配置与使用的更多相关文章
- mysql中日志的配置与分析
默认情况下,如果日志没有配置,则只记录错误日志,记录到syslog,配置文件 /etc/mysql/conf.d/mysqld_safe_syslog.cnf (ubuntu下) [mysqld_sa ...
- java项目中日志的配置
1.日志相关比较详细的介绍:https://www.cnblogs.com/tanshaoxiaoji/p/log4j_config.html 2.总结1中博客说的内容 目前市场上常用的日志有log4 ...
- Yii2中的环境配置
默认的Debug配置 在入口文件中 defined ( 'YII_DEBUG' ) or define ( 'YII_DEBUG', true ); defined ( 'YII_ENV' ) or ...
- Yii2 中日志的记录
Yii2自带日志记录,但用起来感觉比较不是很顺手,故自己封装了个方法,如下: /** * 记录日志 * * @param type $msg * @time 2015年8月31日17:46:20 * ...
- Yii2.0简单隐藏index.php文件和模块配置和layout布局配置禁用和日志写入配置
隐藏index.php文件 目的:想去掉浏览器地址栏中的 index.php?r= 这一块. 在/config/web.php中 ’components'=>[] 中添加如下代码: 'u ...
- Xcode8中处理打印日志的配置
Xcode8中处理打印日志的配置
- django中邮件、日志的配置
邮件的发送及配置 # 配置邮件 EMAIL_USE_SSL = True EMAIL_HOST = 'smtp.qq.com' # 如果是 163 改成 smtp.163.com EMAIL_PORT ...
- 利用log4j+mongodb实现分布式系统中日志统一管理
背景 在分布式系统当中,我们有各种各样的WebService,这些服务可能分别部署在不同的服务器上,并且有各自的日志输出.为了方便对这些日志进行统一管理和分析.我们可以将日志统一输出到指定的数 ...
- 关于log4net日志的配置流程
最近又重新整理一下log4net日志的配置,现在记录一下流程和一些遇到的问题,以备后续使用,具体的配置参数等信息.此文无,见谅! 1. 下载log4net.dll文件(网上很多,随便找一个!) 2. ...
随机推荐
- How to Pronounce Word vs. World
How to Pronounce Word vs. World Share Tweet Share Tagged With: Comparison, Dark L What is the differ ...
- 在CentOS7中利用yum命令安装mysql
在CentOS7中利用yum命令安装mysql 原创 2016年08月31日 10:42:33 标签: mysql / centos 4832 一.说明 我们是在VMware虚拟机上安装的mysql, ...
- IPv4和IPv6的差异;如何实现IPv4和IPv6双协议栈的通信
1 IPv4和IPv6的差异 1.1 地址空间 IPv6 与 IPv4 比较最显著的一个改动就是使用 128 比特上的地址来代替了 32 比特长的 IPv4 地址. IPv6 中取消了广播地址, ...
- 在服务器上同时启动多个tomcat
我所用Tomcat服务器都为zip版,非安装版.以两个为例:安装第二个Tomcat完成后,到安装目录下的conf子目录中打开server.xml文件,查找以下三处:(1) 修改http访问端口(默认为 ...
- sqlalchemy 学习--单表操作
以下所有代码片段都使用了统一的引用,该引用如下: from sqlalchemy import create_engine, ForeignKey from sqlalchemy.ext.declar ...
- (转).NET Core 使用 log4net
https://blog.csdn.net/liyazhen2011/article/details/83382221 1.安装log4net 建立.NET Core工程 - 右键 - 管理N ...
- Win2012&Win2008双系统启动菜单设置
电脑最初安装的是XP,后来想升级操作系统,但XP里又有很多常用软件不想重装,于是装了一个Win2008 R2的双系统,安装好2008R2后,系统自动产生一个2008R2的启动菜单,可以选择进入2008 ...
- thymeleaf 的常见属性
- Applese涂颜色-欧拉降幂公式
链接:https://ac.nowcoder.com/acm/contest/330/E来源:牛客网 题目描述 精通程序设计的 Applese 叕写了一个游戏. 在这个游戏中,有一个 n 行 m 列的 ...
- CommonJS/AMD/CMD/UMD
为什么会有这几种模式? 起源:Javascript模块化 模块化就是把复杂问题分解成不同模块,这样可维护性高,从而达到高复用,低耦合. 1.Commonjs CommonJS是服务器端模块的规范,No ...