This will create a queries.log
file inside of storage/logs directory and tailing the file.
php artisan db:log --start
This will delete queries.log.
php artisan db:log --stop
<?php | |
namespace App\Commands\Database; | |
use Illuminate\Support\ServiceProvider; | |
class BindDatabaseServiceProvider extends ServiceProvider | |
{ | |
public function boot() | |
{ | |
$file = storage_path('/logs/queries.log'); | |
if (! file_exists($file)) { | |
return ; | |
} | |
\DB::listen(function ($query) use ($file) { | |
$data = $query->sql . "\n"; | |
$data .= print_r($query->bindings, true); | |
$data .= "TIME: " . $query->time . "\n"; | |
$data .= "----\n"; | |
$data .= "\n"; | |
file_put_contents($file, $data, FILE_APPEND); | |
}); | |
} | |
} |
<?php | |
namespace App\Commands\Database; | |
use Illuminate\Console\Command; | |
use Symfony\Component\Process\Process; | |
class LogCommand extends Command | |
{ | |
/** | |
* @var null|string | |
*/ | |
private $logFile = null; | |
/** | |
* The name and signature of the console command. | |
* | |
* @var string | |
*/ | |
protected $signature = 'db:log | |
{--start : Start log} | |
{--stop : Stop log}'; | |
/** | |
* The console command description. | |
* | |
* @var string | |
*/ | |
protected $description = 'Log database queries.'; | |
/** | |
* Create a new command instance. | |
* @param string $filename | |
*/ | |
public function __construct($filename = 'queries.log') | |
{ | |
parent::__construct(); | |
$this->logFile = storage_path(sprintf("logs/%s", $filename)); | |
} | |
/** | |
* Execute the console command. | |
* | |
* @return mixed | |
*/ | |
public function handle() | |
{ | |
// starting log... | |
if ($this->option('start')) { | |
// create log file | |
exec("touch " . $this->logFile); | |
// run tail and send outputs to the user console. | |
(new Process("clear && tail -f " . escapeshellarg($this->logFile))) | |
->setTimeout(null) | |
->run(function ($type, $line) { | |
$this->output->write($line); | |
}); | |
} | |
// stop... | |
if ($this->hasArgument('stop') && $this->logFileExists()) { | |
exec("rm " . $this->logFile); | |
} | |
} | |
/** | |
* @return bool | |
*/ | |
private function logFileExists() | |
{ | |
return file_exists($this->logFile); | |
} | |
} |
@zabaala aqui eu registro em um provider assim:
https://gist.github.com/meneguite/64e1622548e8d538aa65ed3072a7d745
Assim eu chaveio por uma variável de ambiente quando devo logar as queries.
Ahhh! massa, @meneguite.
Mas assim vc precisa dar um clear na config quando precisar modificar a variavel de ambiente, né?
@zabaala normalmente eu uso isso só em desenvolvimento.. para validar algo.. mas sim, se fosse usar em produção.. eu teria que dar cache clear para pegar essa troca de parâmetros.. mas qualquer deploy novo no meu ambiente já faz esse processo.. logo para o meu caso isso não é um problema.
Muito bacana mano.. uso algo parecido aqui, só com uma abordagem levemente diferente usando variáveis de ambiente.. mas curti sua abordagem.. parabéns!!