Yii使用DbTarget实现日志功能的示例代码
这篇文章主要介绍了Yii使用DbTarget实现日志功能的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
一:在配置文件的log组件中配置DbTarget
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | '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' ], //日志等级 ], ], ], |
二:生成日志表
在项目目录下执行如下命令生成日志表
1 | php yii migrate --migrationPath=@yii/log/migrations/ |
三:使用日志
在需要使用日志的地方使用
1 | Yii::info() |
四:自定义DbTarget日志
1:首先创建一个自定义的日志表
(1)在项目目录下执行
1 | php yii migrate/create create_test_log |
(2):在创建的migrate文件下编写创建数据库的迁移脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | <?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日志表
1 | php yii migrate |
2:编写一个DbTarget类来继承yiilogDbTarget类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 | <?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类改成我们自定义的类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | '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实现日志功能的示例代码的文章就介绍到这了