Skip to main content

PHP Web Access Logger ( Linux Debian Apache Style )

Google Analytics è bello.

Analytics è potente, è tosto, ha mille funzioni, graficamente è da paura e ci piace a tutti. Ok.

MA..

Se siete dei sysadmin e/o avete mai avuto a che fare con un web server linux ( Debian spero! ) vi sarete sicuramente imbattutti in quella cosa meravigliosa chiamata log.

Da terminale ssh è possibile avere, in tempo reale, un' analisi davvero dettagliata di tutto ciò che capita sul(i) vostro(i) sito(i) sia per quanto riguarda gli accessi che gli errori.

I due file in Apache2 si chiamano, di solito, access.log ed error.log e si possono consultare, ad esempio, tramite il comando:

tail -f /directorydelfilelog

es.

tail -f /var/www/www.test.it/web/log/access.log

quello che otteniamo è una lista di "eventi" di questo tipo:

Carino vero?

Tra le varie cose vedo anche l' ip dei "visitatori" ed il loro User Agent. Informazioni davvero utili, non trovate?

Ma se non abbiamo nessun accesso ssh al web server dove è ospitato il nostro sito ( uno fra tutti: Aruba ) come facciamo?

Ci accontentiamo del pur ottimo Google Analytics?

Sì?

Naaaaa

Sviluppiamo un super easy php logger stile quello di Apache su sistemi Linux / Debian!

Ecco il codice:

//Before deleting the folder, delete all it's files
function deleteDir($dirPath){
    if (file_exists($dirPath)){
        if (!is_dir($dirPath)) {
            die("$dirPath must be a directory");
        }
        $files = glob($dirPath . '*', GLOB_MARK);
        foreach ($files as $file) {
            unlink($file);
        }
        rmdir($dirPath);
    }
}
$logFolder = "phplogger";
if (!is_dir($logFolder)){
    mkdir($logFolder, 0700);
}
//lets get some useful stuff
$uri = $_SERVER['REQUEST_URI'];
$ip = $_SERVER['REMOTE_ADDR'];
$referrer = $_SERVER['HTTP_REFERER'];
$userAgent = $_SERVER['HTTP_USER_AGENT'];
//time stuff
$today = getdate(); 
$month = $today['mon']; 
$day = $today['mday']; 
$year = $today['year'];
$hours = $today['hours'];
$minutes =  $today['minutes'];
//string 2 log
$stingToLog = $year . "-" . $month . "-" . $day . " " . $hours . ":" . $minutes . "  " . $ip . "  " . $uri . " " . $userAgent . " " . $referrer . "\r\n";
//current month dir
if (!is_dir($logFolder."/".$month)) {
    mkdir($logFolder."/".$month, 0700);
}
//single day log file
$file = $logFolder.'/'.$month."/".$year."-".$month."-".$day.".txt";
//last month
($month == 1) ? $precMon = 12 : $precMon = $month -1;
//if day >=28 delete old month dir
if ($day>=28 && is_dir($logFolder."/".$precMon) ){
    deleteDir($logFolder."/".$precMon);
}
if (!file_exists($file)){
    touch($file);
}
//lets write
file_put_contents($file, $stingToLog, FILE_APPEND | LOCK_EX);

La directory dei log che viene creata ( nella root web ) è come in immagine:

Ed il file di log, al suo interno, è fatto così:

I dati che ho deciso di loggare ( ma potete modificarli a vostro piacere! ) sono i seguenti:

Anno-mese-giorno ora:minuti IP URI User Agent Referrer

Ora, vi starete chiedendo: dove inserire questo script?

In un file che viene richiamato ogni qual volta viene aperta una pagina che vi interessa monitorare ( es. nel footer ).

Buoni log a tutti!

Condividi