博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Laravel和Lumen开启SQL日志记录
阅读量:3987 次
发布时间:2019-05-24

本文共 3426 字,大约阅读时间需要 11 分钟。

Laravel并不会默认打印sql,所以需要我们自己来设置。

1、临时打印SQL

DB::enableQueryLog();查询操作Log::debug(DB::getQueryLog());

2、自动记录SQL日志

方法1:监听 QueryExecuted 事件

此事件是由 Illuminate\Database 提供,并且当你发起SQL的时候,此事件是被触发的,只是没有对应的监听器罢了。

在 app/Providers/EventServicePorvider.php 文件中 添加要注册的事件

use Illuminate\Database\Events\QueryExecuted;use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;class EventServiceProvider extends ServiceProvider{
protected $listen = [ 'Illuminate\Database\Events\QueryExecuted' => [ 'App\Listeners\QueryListener', ], ];}

执行 命令 php artisan event:generate

在 App\Listeners\QueryListener 文件的 handle 方法中编写记录 sql 的业务逻辑,如:

use Monolog\Handler\RotatingFileHandler;use Monolog\Logger;public function handle(QueryExecuted $event){
try{
if (env('APP_DEBUG') == true) {
$sql = str_replace("?", "'%s'", $event->sql); foreach ($event->bindings as $i => $binding) {
if ($binding instanceof \DateTime) {
$event->bindings[$i] = $binding->format('\'Y-m-d H:i:s\''); } else {
if (is_string($binding)) {
$event->bindings[$i] = "'$binding'"; } } } $log = vsprintf($sql, $event->bindings); $log = $log.' [ RunTime:'.$event->time.'ms ] '; (new Logger('sql'))->pushHandler(new RotatingFileHandler(storage_path('logs/sql/sql.log')))->info($log); } }catch (\Exception $exception){
}}

日志文件默认保存在 storage/logs/sql/ 目录下

方法2:

在 app/providers/AppServicesProviders.php 文件的 boot 方法编写如下代码

use Illuminate\Support\Facades\DB;DB::listen(    function ($sql) {
foreach ($sql->bindings as $i => $binding) {
if ($binding instanceof \DateTime) {
$sql->bindings[$i] = $binding->format('Y-m-d H:i:s'); } else {
if (is_string($binding)) {
$sql->bindings[$i] = "'$binding'"; } } } // Insert bindings into query $query = str_replace(array('%', '?'), array('%%', '%s'), $sql->sql); $query = vsprintf($query, $sql->bindings); // Save the query to file $logFile = fopen( storage_path('logs' . DIRECTORY_SEPARATOR . date('Y-m-d') . '_query.log'), 'a+' ); fwrite($logFile, date('Y-m-d H:i:s') . ': ' . $query . PHP_EOL); fclose($logFile); });

或者

DB::listen(function ($query) {
$tmp = str_replace('?', '"'.'%s'.'"', $query->sql); $qBindings = []; foreach ($query->bindings as $key => $value) {
if (is_numeric($key)) {
$qBindings[] = $value; } else {
$tmp = str_replace(':'.$key, '"'.$value.'"', $tmp); } } $tmp = vsprintf($tmp, $qBindings); $tmp = str_replace("\\", "", $tmp); \Log::info(' execution time: '.$query->time.'ms; '.$tmp."\n\n\t");});

我们来看一下源码

此处 Facades\DB 代表我的 Illuminate\Database\MySqlConnection ,因为我也的是MySQL数据库,在它的基类 Connection 中有个 listen 方法:

public function listen(Closure $callback){
if (isset($this->events)) {
$this->events->listen(Events\QueryExecuted::class, $callback); }}

就是将闭包 $callback 监听 Events\QueryExecuted 事件,也就是方法1的 Illuminate\Database\Events\QueryExecuted 事件,然后传入到闭包中的参数 $sql 或 q u e r y 就 是 方 法 1 的 query 就是方法1的 query1event。

转载地址:http://yzaui.baihongyu.com/

你可能感兴趣的文章
GetSafeHwnd()的调用正确时机
查看>>
coursesa课程 Python 3 programming course_2_assessment_1
查看>>
coursesa课程 Python 3 programming 统计文件有多少单词
查看>>
coursesa课程 Python 3 programming 输出每一行句子的第三个单词
查看>>
coursesa课程 Python 3 programming Dictionary methods 字典的方法
查看>>
coursesa课程 Python 3 programming Accumulating Multiple Results In a Dictionary 统计文件的字母数量
查看>>
Returning a value from a function
查看>>
coursesa课程 Python 3 programming Functions can call other functions 函数调用另一个函数
查看>>
coursesa课程 Python 3 programming Tuple Assignment with Unpacking
查看>>
coursesa课程 Python 3 programming The while Statement
查看>>
course_2_assessment_6
查看>>
coursesa课程 Python 3 programming course_2_assessment_7 多参数函数练习题
查看>>
coursesa课程 Python 3 programming 排序函数sorted的可选参数
查看>>
coursesa课程 Python 3 programming course_2_assessment_8 sorted练习题
查看>>
visca接口转RS-232C接口线序
查看>>
在unity中建立最小的shader(Minimal Shader)
查看>>
RGB 立方体
查看>>
1.3 Debugging of Shaders (调试着色器)
查看>>
关于phpcms中模块_tag.class.php中的pc_tag()方法的含义
查看>>
vsftp 配置具有匿名登录也有系统用户登录,系统用户有管理权限,匿名只有下载权限。
查看>>