itaeng

LogHappens - come tenere d'occhio i log files, senza impazzire

Qualche tempo fa ho scoperto un tool dal nome divertente e con uno scopo utilissimo: poter tenere d'occhio log files, a piacimento, senza diventare matti interpretando file di testo da centinaia di righe, solitamente formattati in modo non troppo chiaro.

Tutto molto bello, peccato che creare dei nuovi parser è un delirio di regex, regole e requisiti non proprio chiarissimi... così ho iniziato a fare un mio parser.

LogHappened

Così è nato LogHappens. La grafica è minimale e molto semplice: un menu laterale in cui scegliere il log che si vuole visualizzare, un contatore per avere sempre un'idea di quante entries sono presenti per ogni log file... ed i log. Suddivisi come preferisci, anche se probabilmente farlo per data e ora è il modo più semplice. Quando succede qualcosa di nuovo, per esempio viene rilevato una nuova entry in uno dei file, LogHappens mostra un popup del browser (mostrato quindi dal sistema operativo, anche quando l'app non è in primo piano).

Sì, ma come funziona?

Il funzionamento, come dicevo, doveva essere molto semplice: In una cartella `logics` sono presenti tanti files quanti sono i log che vuoi tenere sotto controllo. Nella cartella `logics_templates` sono presenti invece, come puoi immaginare, alcuni esempi di file logics. Uno di questi serve per interpretare i log files di apache, e contiene questo codice:


<?php
$menu = [
    'icon' => 'build',
    'color' => 'red',
    'title' => 'Apache error.log',
    'file' => '/var/log/apache2/error.log'
];

$content = file($menu['file']);
$log = [];

foreach ($content as $line) {
    // Grab the log's time and group logs by time
    $time = substr($line, 1, 19);
    $time = date("l d-m-Y - H:i:s", strtotime($time));

    // Remove date-time and other useless informations from the log details
    $line = substr($line, 34);
    $line = preg_replace('[\[:error.*\]]', '', $line);
    $line = preg_replace('[\[pid .*\]]', '', $line);
    $line = str_replace('PHP', '', $line);
    $line = trim($line);

    // Highlight the type of errors, using a badge
    $line = preg_replace("/^Notice: /", "Notice: ", $line);
    $line = preg_replace("/^Warning: /", "Warning: ", $line);
    $line = preg_replace("/^Fatal error: /", "Fatal error: ", $line);
    $line = preg_replace("/^Parse error: /", "Parse error: ", $line);
    $line = preg_replace("/^Error: /", "Error: ", $line);
  
    // Save the log entry
    $log[$time][] = $line;
}

// Reverse the logs, so that we can see last errors first
$logs = array_reverse($log);

Piuttosto semplice, non è vero? Modificando un po' questo file, è possibile creare un parser per virtualmente qualunque tipo di log file.