Laravel-tips del 1 – Loggar

Dela upp loggarna per dag (och typ)

Tidigare versioner av Laravel (4.1 och neråt), delade upp loggarna per dag och typ (cli, apache2handler etc.). Men i och med introduktionen av artisan tail (se dokumentationen) så valde de att samla all loggning i en och samma fil. Men föredrar man den tidigare metoden och man inte använder tail-kommandot så är det enkelt fixat.

I app/start/global.php hittar man raden

Log::useFiles(storage_path().'/logs/laravel.log');

Byt ut det mot följande istället:

Log::useDailyFiles(storage_path().'/logs/laravel.log');

Bonus; om man vill ha det riktigt i detalj, kör också med PHP-funktionen php_sapi_name() för att se vilket interface som PHP körs med när logfilen skrivs:

$logFile = 'log-' . php_sapi_name() . '.txt';
Log::useDailyFiles(storage_path() . '/logs/' . $logFile);

Nu kommer du direkt kunna söka upp dina loggfiler både baserade på interface och datum. Filnamnen kommer se ut något liknande som:

log-fpm-fcgi-2014-07-02.txt

Logga SQL-queries

Jagar du efter SQL-optimeringar med hjälp av eager loading, eller testar du dina cache:ningsmetoder? Då bör du logga dina queries under utvecklingen så att du i detalj kan se vad som händer under huven när Eloquent (eller för all del Query Builder) gör sitt jobb.

Detta görs enklast via Event::listen, på illuminate.query:

Event::listen('illuminate.query', function($query, $bindings, $time, $name) {
    $query = str_replace(array('%', '?'), array('%%', '%s'), $query);
    $query = vsprintf($query, $bindings);
    $data = compact('query', 'time', 'name');
    Log::info($data);
});

Ett tips här är att i din miljös database-config sätta ett värde, t.ex. log till true eller false så att du enkelt kan styra i vilka miljöer du vill logga dina queries.

if (Config::get('database.log', false)) {
    // Code
}

Att logga queries är smidigast om man samtidigt använder tail-kommandot för att få ut datan direkt i terminalen.

Ordna med irriterade 404-loggar

Som standard så loggar Laravel alla fel, inklusive 404:or, i samma format. T.ex:

[2014-07-02 09:06:33] local.ERROR: exception 'Symfony\Component\HttpKernel\Exception\NotFoundHttpException' in /home/vagrant/Code/laravel/vendor/laravel/framework/src/Illuminate/Routing/RouteCollection.php:146

// ## Stack trace

Detta är minst sagt onödigt när det kommer till 404:or, och hjälper en inte särskilt mycket att ens se vilken URL som triggade felet.

Men, det är enkelt fixat!

Igen i app/start/global.php så finns den lilla kodsnutten:

App::error(function(Exception $exception, $code)
{
    Log::error($exception);
});

Nu är det endast 404:or vi vill ordna annorlunda (fler exempel kommer i framtida blogginlägg), så det fixar man rimligtvis snyggast så här:

App::error(function(Exception $exception, $code)
{
    switch ($code) {
        case 404:
            Log::error($code . ' thrown @ ' . Request::url());
            break;

        default:
            Log::error($exception);
            break;
    }
});

Nu kommer något liknande:

[2014-07-02 09:16:33] local.ERROR: 404 thrown @ http://site.dev:8000/this/is/a/404 [] []

att dyka upp i loggen istället. Självklart kan man använda Log::error($exception); också om man vill ha hela trace:en.

Hoppas att det här är till användning för andra Laravel-fantaster, har du själv några tips? @olssonm är jag på Twitter.