Yii使用DbTarget实现日志功能的示例代码

一:在配置文件的log组件中配置DbTarget

'log' => [
 'traceLevel' => YII_DEBUG ? 3 : 0,
 'targets' => [
  [
   'class' => 'yii\log\FileTarget',
   'levels' => ['error', 'warning'],
  ],
  'test' => [
   'class' => 'yii\log\DbTarget',//DaTarget类
   'logTable' => '{{%test_log}}',//日志表
   'levels' => ['error', 'info', 'warning'],//日志等级
  ],
 ],
],

二:生成日志表

在项目目录下执行如下命令生成日志表

php yii migrate --migrationPath=@yii/log/migrations/

三:使用日志

在需要使用日志的地方使用

Yii::info()

四:自定义DbTarget日志

1:首先创建一个自定义的日志表

(1)在项目目录下执行

php yii migrate/create create_test_log

(2):在创建的migrate文件下编写创建数据库的迁移脚本

<?php
use yii\db\Migration;
/**
 * Class m200720_091126_create_test_log
 */
class m200720_091126_create_test_log extends Migration
{
 /**
  * {@inheritdoc}
  */
 public function safeUp()
 {
  $this->createTable('{{%test_log}}', [
   'id' => $this->bigPrimaryKey(),
   'level' => $this->integer()->notNull()->comment('日志等级'),
   'category' => $this->string(100)->notNull()->comment('分类名称'),
   'prefix' => $this->text(),
   'route' => $this->string(100)->notNull()->comment('路由'),
   'method' => $this->string(20)->notNull()->comment('请求方式'),
   'app' => $this->string(20)->comment('请求应用'),
   'module' => $this->string(20)->comment('请求模块'),
   'request' => $this->text()->comment('请求参数'),
   'status' => $this->string(10)->notNull()->comment('状态码'),
   'message' => $this->text()->comment('日志内容'),
   'request_at' => $this->double()->notNull()->comment('请求时间'),
   'ip' => $this->string(63)->comment('请求IP'),
  ], 'CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE=InnoDB COMMENT=\'请求日志表\'');
  //增加索引
  $this->createIndex('idx_log_level', '{{%test_log}}', 'level');
  $this->createIndex('idx_log_category', '{{%test_log}}', 'category');
  $this->createIndex('idx_log_route', '{{%test_log}}', 'route');
  $this->createIndex('idx_log_method', '{{%test_log}}', 'method');
  $this->createIndex('idx_log_status', '{{%test_log}}', 'status');
 }
 /**
  * @inheritdoc
  */
 public function safeDown()
 {
  $this->dropTable('{{%test_log}}');
 }
}

(3):执行如下命令生成DbTarget日志表

php yii migrate

2:编写一个DbTarget类来继承yiilogDbTarget类

<?php
namespace app\components;
use Yii;
use yii\helpers\VarDumper;
use yii\log\LogRuntimeException;
use yii\web\HttpException;
use yii\web\Request;
/**
 * DbTarget stores log messages in a database table.
 *
 * @see yii\log\DbTarget
 *
 * @author wangjian
 * @since 1.0
 */
class DbTarget extends \yii\log\DbTarget
{
 /**
  * @inheritdoc
  */
 public $categories = [
  'application',
  'yii\web\HttpException:*',
 ];
 /**
  * @inheritdoc
  */
 public $except = [
  // 'yii\web\HttpException:404',
 ];
 /**
  * @inheritdoc
  */
 public $logVars = ['_GET', '_POST'];
 /**
  * @var string 用户组件ID
  */
 public $userComponentId = 'user';
 /**
  * @inheritdoc
  */
 public function collect($messages, $final)
 {
  $this->messages = array_merge($this->messages, static::filterMessages($messages, $this->getLevels(), $this->categories, $this->except));
  $count = count($this->messages);
  if ($count > 0 && ($final || $this->exportInterval > 0 && $count >= $this->exportInterval)) {
   $oldExportInterval = $this->exportInterval;
   $this->exportInterval = 0;
   $this->export();
   $this->exportInterval = $oldExportInterval;
   $this->messages = [];
  }
 }
 /**
  * @inheritdoc
  */
 public function getMessagePrefix($message)
 {
  if ($this->prefix !== null) {
   return call_user_func($this->prefix, $message);
  }
  if (Yii::$app === null) {
   return '';
  }
  $ip = $this->getIp();
  $ip = empty($ip) ? '-' : $ip;
  return "[$ip]";
 }
 /**
  * @inheritdoc
  */
 public function export()
 {
  if ($this->db->getTransaction()) {
   $this->db = clone $this->db;
  }
  $tableName = $this->db->quoteTableName($this->logTable);
  $sql = "INSERT INTO $tableName ([[level]], [[category]], [[prefix]], [[route]], [[method]], [[app]], [[module]], [[request]], [[status]], [[message]], [[request_at]], [[ip]])
    VALUES (:level, :category, :prefix, :route, :method, :app, :module, :request, :status, :message, :request_at, :ip)";
  $command = $this->db->createCommand($sql);
  $request = Yii::$app->getRequest();
  list($route, $params) = $request->resolve();
  $method = $request->getMethod();
  $module = Yii::$app->controller->module->id;
  $route = str_replace("{$module}/", '', $route);
  foreach ($this->messages as $message) {
   list($text, $level, $category, $timestamp) = $message;
   $statusCode = 200;
   if (!is_string($text)) {
    if ($text instanceof \Throwable || $text instanceof \Exception) {
     $statusCode = $text instanceof HttpException ? $text->statusCode : 500;
     $text = $text->getMessage();
    } else {
     $text = VarDumper::export($text);
    }
   }
   if ($command->bindValues([
     ':level' => $level,
     ':category' => $category,
     ':prefix' => $this->getMessagePrefix($message),
     ':route' => $route,
     ':method' => $method,
     ':app' => Yii::$app->id,
     ':module' => $module,
     ':request' => $this->getContextMessage(),
     ':status' => $statusCode,
     ':message' => $text,
     ':request_at' => $timestamp,
     ':ip' => $this->getIp(),
    ])->execute() > 0) {
    continue;
   }
   throw new LogRuntimeException('Unable to export log through database!');
  }
 }
 /**
  * 获取当前IP
  */
 protected function getIp()
 {
  $request = Yii::$app->getRequest();
  return $request instanceof Request ? $request->getUserIP() : '';
 }
}

3:在配置文件中将yiilogDbTarget类改成我们自定义的类

'log' => [
 'traceLevel' => YII_DEBUG ? 3 : 0,
 'targets' => [
  [
   'class' => 'yii\log\FileTarget',
   'levels' => ['error', 'warning'],
  ],
  'test' => [
   'class' => 'app\components\DbTarget',
   'logTable' => '{{%test_log}}',
   'levels' => ['error', 'info', 'warning'],
  ],
 ],
],

4:使用DbTarget日志

同样的使用Yii::info来记录日志

到此这篇关于Yii使用DbTarget实现日志功能的示例代码的文章就介绍到这了,更多相关Yii DbTarget 日志内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • YII Framework框架教程之日志用法详解

    本文实例讲述了YII Framework框架日志用法.分享给大家供大家参考,具体如下: 日志的作用(此处省略1000字) YII中的日志很好很强大,允许你把日志信息存放到数据库,发送到制定email,存放咋文件中,意见显示页面是,甚至可以用来做性能分析. YII中日志的基本配置:/yii_dev/testwebap/protected/config/main.php 'log'=>array( 'class'=>'CLogRouter', 'routes'=>array( array(

  • Yii2框架中日志的使用方法分析

    本文实例讲述了Yii2框架中日志的使用方法.分享给大家供大家参考,具体如下: Yii2和Yii1.x的区别 Yii2里面日志的使用方法和Yii 1.x并不相同, 在Yii 1.x中,记录日志的方法为 Yii::log($message, $level, $category); Yii::trace($message, $category); 后者仅在调试模式下记录日志. 这里的log方法是YiiBase的静态方法. 在Yii2中,面向对象的设计贯彻得更加彻底,日志记录功能被转移到Logger类中

  • Yii框架实现记录日志到自定义文件的方法

    本文实例讲述了Yii框架实现记录日志到自定义文件的方法.分享给大家供大家参考,具体如下: 默认情况下,Yii::log($msg, $level, $category)会把日志记录到runtime/application.log文件中 日志格式如下: [时间] - [级别] - [类别] - [内容] 2013/05/03 17:33:08 [error] [application] test 但有时候需要把某些特定的日志放到特定的文件中,比如交易失败的日志,需要和其他日志区分开来单独记录. 在

  • PHP的Yii框架的常用日志操作总结

    日志 Yii提供了一个高度自定义化和高扩展性的日志框架.根据使用场景的不同,你可以很容易的对各种消息就行记录.过滤.合并,比如说文本文件,数据库文件,邮件. 使用Yii的日志框架包含如下步骤: 调用日志记录的方法 在主应用的配置文件(例如basic下面的web.php)中配置好日志的过滤和导出的设置 检查不同场景下经过过滤之后的日志信息 记录日志 记录日志其实就是简简单单的调用如下的方法: [[Yii::trace()]]: 记录关于某段代码运行的相关消息.主要是用于开发环境. [[Yii::i

  • 全面解读PHP的Yii框架中的日志功能

    Yii页面级日志开启 在 Main.php中 log段添加. 下面显示页面日志 array( 'class'=>'CWebLogRoute', 'levels'=>'trace', //级别为trace 'categories'=>'system.db.*' //只显示关于数据库信息,包括数据库连接,数据库执行语句 ), 完整如下: 'log'=>array( 'class'=>'CLogRouter', 'routes'=>array( array( 'class'=

  • 详解PHP的Yii框架中日志的相关配置及使用

    默认的日志是输出到protected/runtime/application.log 如果需要修改那么需要在main.php里面的 components 下面增加log配置,如下: 'preload' => array('log'),//这句也必须加上 'components' => array( 'log'=>array( 'class'=>'CLogRouter', 'routes'=>array( //这是一个文件route表示category为test开头的所有类型的

  • YII2框架中日志的配置与使用方法实例分析

    本文实例讲述了YII2框架中日志的配置与使用方法.分享给大家供大家参考,具体如下: YII2中给我们提供了非常方便的日志组件,只需要简单配置一下就可以使用. 我们在config/web.php中配置如下: return [ //log必须在bootstrap期间就被加载,便于及时调度日志消息到目标 'bootstrap' => ['log'], 'components' => [ 'log' => [ //消息跟踪级别,设置yii\log\Dispatcher::traceLevel属性

  • Yii框架日志操作图文与实例详解

    本文实例讲述了Yii框架日志操作.分享给大家供大家参考,具体如下: 将日志记录到文本中. Yii::log("test"); //写入测试日志 //找到配置文件 component->log 'log'=>array( 'class'=>'CLogRouter', 'routes'=>array( array( 'class'=>'CFileLogRoute', 'levels'=>'warning,error,info' , ), 将指定的cate

  • Yii框架日志记录Logging操作示例

    本文实例讲述了Yii框架日志记录Logging操作.分享给大家供大家参考,具体如下: 1.Yii::getLogger()->log($message, $level, $category = 'application') 2.Yii::trace($message, $category = 'application'); 3.Yii::error($message, $category = 'application'); 4.Yii::warning($message, $category =

  • Yii使用DbTarget实现日志功能的示例代码

    一:在配置文件的log组件中配置DbTarget 'log' => [ 'traceLevel' => YII_DEBUG ? 3 : 0, 'targets' => [ [ 'class' => 'yii\log\FileTarget', 'levels' => ['error', 'warning'], ], 'test' => [ 'class' => 'yii\log\DbTarget',//DaTarget类 'logTable' => '{{%t

  • MyBatis XML方式的基本用法之多表查询功能的示例代码

    1. 多表查询 在之前,我们示例的2个查询都是单表查询,但实际的业务场景肯定是需要多表查询的,比如现在有个需求: 查询某个用户拥有的所有角色.这个需求要涉及到sys_user,sys_user_role,sys_role三张表,如何实现呢? 首先,在SysUserMapper接口中定义如下方法. /** * 根据用户id获取角色信息 * * @param userId * @return */ List<SysRole> selectRolesByUserId(Long userId); 然后

  • JAVA Netty实现聊天室+私聊功能的示例代码

    功能介绍 使用Netty框架实现聊天室功能,服务器可监控客户端上下限状态,消息转发.同时实现了点对点私聊功能.技术点我都在代码中做了备注,这里不再重复写了.希望能给想学习netty的同学一点参考. 服务器代码 服务器入口代码 package nio.test.netty.groupChat; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; import io.netty.chann

  • SpringBoot通过自定义注解实现日志打印的示例代码

    前言 在我们日常的开发过程中通过打印详细的日志信息能够帮助我们很好地去发现开发过程中可能出现的Bug,特别是在开发Controller层的接口时,我们一般会打印出Request请求参数和Response响应结果,但是如果这些打印日志的代码相对而言还是比较重复的,那么我们可以通过什么样的方式来简化日志打印的代码呢? SpringBoot 通过自定义注解实现权限检查可参考我的博客:SpringBoot 通过自定义注解实现权限检查 正文 Spring AOP Spring AOP 即面向切面,是对OO

  • springboot整合gateway实现网关功能的示例代码

    目录 1.使用场景: 2.代码实现 1创建gateway-service服务 2创建gateway-client服务 3.实现效果 1.使用场景: 网关可提供请求路由与组合.协议转换.安全认证.服务鉴权.流量控制与日志监控等服务.可选的网关有不少,比如 Nginx..Linkerd .eureka. Spring Cloud Gateway.consul等. Spring Cloud Gateway 针对进来的请求做各种判断和处理,比如说判断请求的合法性.权限验证,请求地址改写,请求参数.头信息

  • springboot整合@Retryable实现重试功能的示例代码

    目录 前言 @Retryable 简介 使用步骤 1.引入依赖 2.启用@Retryable 3.添加@Retryable注解 4.测试 注意事项 最后 结语 前言 在实际工作中,重试机制是一个很常见的场景,比如:发送消息失败,下载网络文件失败等…,因为这些错误可能是网络波动造成的,等待一些延迟就能成功处理.我们通常会使用try/catch.while循环等进行相关处理,但是这样看起来比较臃肿复杂,且不好看.于是就有了spring提供的重试模块—— @Retryable @Retryable 简

  • WPF+ASP.NET SignalR实现简易在线聊天功能的示例代码

    目录 涉及知识点 什么是ASP.NET SignalR 在线聊天整体架构 ASP.NET SignalR在线聊天服务端 1. 创建ASP.NET Web API项目 2. 创建消息通知中心Hub 3. 注册服务和路由 4. ASP.NET SignalR中心对象生存周期 SignalR客户端 1. 安装SignalR客户端依赖库 2. 客户端消息接收发送 运行示例 在实际业务中,当后台数据发生变化,客户端能够实时的收到通知,而不是由用户主动的进行页面刷新才能查看,这将是一个非常人性化的设计.有没

  • VUE饿了么树形控件添加增删改功能的示例代码

    本文介绍了VUE饿了么树形控件添加增删改功能的示例代码,分享给大家,具体如下: element-ui树形控件:地址 在原文档中有个案例是有新增和删除功能,但是后来发现其修改的数据并不能直接影响到树形数据,所以采用了 render-content 的API重新写了个组件. 写个开发的步骤,所以文章比较长emmm 大致效果如图: 1.省市API 在网上复制了个省市的list,有两个属性是新增的 isEdit :控制编辑状态 maxexpandId :为现下id的最大值 export default{

  • Android仿微信发送语音消息的功能及示例代码

    微信的发送语音是有一个向上取消的,我们使用onTouchListener来监听手势,然后做出相应的操作就行了. 直接上代码: //语音操作对象 private MediaPlayer mPlayer = null; private MediaRecorder mRecorder = null; //语音文件保存路径 private String FileName = null; FileName = Environment.getExternalStorageDirectory().getAbs

  • php 实现收藏功能的示例代码

    整理文档,搜刮出一个php 实现收藏功能的示例代码,稍微整理精简一下做下分享. HTML: <a class = "x" id="{$photo.id}" uid="{$Think.session.uid}" status = "{$collect_pic}" href = "javascript:void(0);"> <if condition = "$collect_num

随机推荐