Laravel 写入sql日志

来源:互联网 发布:mysql root 权限不足 编辑:程序博客网 时间:2024/05/29 11:43

1.laravel5.4

在/app/Providers/AppServiceProvider.php代码如下

<?phpnamespace App\Providers;use Illuminate\Support\ServiceProvider;use DB;class AppServiceProvider extends ServiceProvider{    /**     * Bootstrap any application services.     *     * @return void     */    public function boot()    {        DB::listen(function ($query) {            $sql = str_replace("?", "'%s'", $query->sql);            $log = vsprintf($sql, $query->bindings);            $log = '[' . date('Y-m-d H:i:s') . '] ' . $log . "\r\n";            $filepath = storage_path('logs\sql.log');            file_put_contents($filepath, $log, FILE_APPEND);        });    }    /**     * Register any application services.     *     * @return void     */    public function register()    {        //    }}

最终日志会显示在\storage\logs\sql.log

2.laravel5.*

使用监听器

第一步:创建监听器

php artisan make:listener QueryListener --event=illuminate.query

生成文件于 app/Listeners/QueryListener.php

然后删除 app/Listeners/QueryListener.php 顶部的 use App\Events\illuminate.query;, 这是自动生成的。

第二步:注册事件

打开 app/Providers/EventServiceProvider.php,在 $listen 中添加 illuminate.query 事件的监听器为 QueryListener

protected $listen = [        'illuminate.query' => [            QueryListener::class,        ],    ];
当然在类前面你需要 use App\Listeners\QueryListener; 不然就报类不存在了。

第三步:添加逻辑

修改上面生成的文件,我们把 SQL 查询记录到日志里,所以编辑 handle 方法为:

    /**     * Handle the event.     *     * @param  Events  $event     * @return void     */    public function handle($sql, $params)    {        if (env('APP_ENV', 'production') == 'local') {            foreach ($params as $index => $param) {                if ($param instanceof DateTime) {                    $params[$index] = $param->format('Y-m-d H:i:s');                }            }            $sql = str_replace("?", "'%s'", $sql);            array_unshift($params, $sql);            Log::info(call_user_func_array('sprintf', $params));        }    }


上面我们用到了两个类:Log 与 DateTime, 别忘记引入它们。

解释一下上面的代码:

  1. illuminate.query 事件触发时的参数为两个:handle($sql, $params), SQL 预处理语句与查询参数值;
  2. 我们只在开发环境记录 SQL:env('APP_ENV', 'production') == 'local'
  3. 我们的参数里可能存在日期类型,所以直接记日志会报错,所以处理一下:$param instanceof DateTime

然后跑一下试试吧,应该在日志里就能看到:

[2017-11-09 05:31:57] local.INFO: select * from `bk_article_position` where `is_delete` = '1' and `is_active` = '1' order by `id` desc  [2017-11-09 05:31:57] local.INFO: select * from `bk_article_tags` where `is_delete` = '1' and `is_active` = '1' order by `id` desc  [2017-11-09 05:31:57] local.INFO: select * from `bk_article_position` where `is_delete` = '1' and `is_active` = '1' order by `id` desc  
最终显示在\storage\logs\laravel.log

原创粉丝点击