QueryLoggerServiceProvider   A
last analyzed

Complexity

Total Complexity 10

Size/Duplication

Total Lines 102
Duplicated Lines 0 %

Importance

Changes 3
Bugs 1 Features 0
Metric Value
eloc 41
c 3
b 1
f 0
dl 0
loc 102
rs 10
wmc 10

4 Methods

Rating   Name   Duplication   Size   Complexity  
A writeMongoDbLog() 0 9 1
A boot() 0 18 3
A writeMySqlLog() 0 22 3
A listenQueryLogging() 0 13 3
1
<?php
2
3
namespace Pnlinh\QueryLogger;
4
5
use DateTime;
6
use Illuminate\Database\Events\QueryExecuted;
7
use Illuminate\Http\Request;
8
use Illuminate\Log\LogManager;
9
use Illuminate\Support\Carbon;
10
use Illuminate\Support\ServiceProvider;
11
12
class QueryLoggerServiceProvider extends ServiceProvider
13
{
14
    public const MYSQL = 'mysql';
15
    public const SQLITE = 'sqlite';
16
    public const MONGODB = 'mongodb';
17
18
    /**
19
     * Bootstrap services.
20
     *
21
     * @param Request $request
22
     *
23
     * @throws \Illuminate\Contracts\Container\BindingResolutionException
24
     *
25
     * @return void
26
     */
27
    public function boot(Request $request)
28
    {
29
        if ($this->app->runningInConsole()) {
30
            $this->publishes([
31
                __DIR__.'/../config/query-logger.php' => config_path('query-logger.php'),
32
            ], 'query-logger');
33
        }
34
35
        if (!config('query-logger.enabled')) {
36
            return;
37
        }
38
39
        $logger = app('log');
40
41
        $logger->info('STARTING REQUEST');
42
        $logger->info(sprintf('[%s] -> %s', $request->method(), $request->path()));
43
44
        $this->listenQueryLogging($logger);
45
    }
46
47
    /**
48
     * Listen connection event.
49
     *
50
     * @param LogManager $logger
51
     */
52
    protected function listenQueryLogging(LogManager $logger)
53
    {
54
        app('db')->connection()->enableQueryLog();
55
56
        app('db')->listen(function (QueryExecuted $query) use ($logger) {
57
            $driver = $query->connection->getDriverName();
58
59
            if (in_array($driver, [static::SQLITE, static::MYSQL])) {
60
                $this->writeMySqlLog($query, $logger);
61
            }
62
63
            if ($driver === static::MONGODB) {
64
                $this->writeMongoDbLog($query, $logger);
65
            }
66
        });
67
    }
68
69
    /**
70
     * Write mysql log.
71
     *
72
     * @param QueryExecuted $query
73
     * @param LogManager    $logger
74
     */
75
    protected function writeMySqlLog(QueryExecuted $query, LogManager $logger)
76
    {
77
        foreach ($query->bindings as &$binding) {
78
            if ($binding instanceof DateTime) {
79
                $binding = Carbon::instance($binding)->toDateTimeString();
80
            }
81
        }
82
83
        $tempStr = sprintf('@%s@', date('Y'));
84
85
        $sql = $query->sql;
86
        $sql = str_replace(['%', '?'], [$tempStr, '"%s"'], $sql);
87
        $sql = vsprintf(str_replace('?', '"%s"', $sql), $query->bindings);
88
        $sql = str_replace($tempStr, '%', $sql);
89
90
        $messages = [
91
            '[SQL]',
92
            sprintf('[%s]', strtoupper($query->connectionName)),
93
            sprintf('[%s ms]', str_pad($query->time, 4, 0)),
94
            $sql,
95
        ];
96
        $logger->info(implode(' ', $messages));
97
    }
98
99
    /**
100
     * Write mongodb log.
101
     *
102
     * @param QueryExecuted $query
103
     * @param LogManager    $logger
104
     */
105
    protected function writeMongoDbLog(QueryExecuted $query, LogManager $logger)
106
    {
107
        $messages = [
108
            '[MONGODB]',
109
            sprintf('[%s]', strtoupper($query->connectionName)),
110
            sprintf('[%s ms]', str_pad($query->time, 4, 0)),
111
            $query->sql,
112
        ];
113
        $logger->info(implode(' ', $messages));
114
    }
115
}
116