Premessa
LOG è l’estensione di un file prodotto automaticamente che può contenere record di eventi provenienti da determinati software e sistemi operativi. Nei sistemi Linux i file di log dei vari applicativi vengono salvati dentro la cartella /var/log.
Il log (registro) è in pratica una sequenza di registrazioni di dati. In un web server, il log tiene traccia di tutte le chiamate GET e POST ricevute, è un file che contiene molti dati utili per poter fare svariate considerazioni come, ad esempio, quali URL di un sito web vengono scansionati più spesso dai motori di ricerca.
In altre guide abbiamo visto alcuni metodi per monitorare e analizzare il log del web server:
- Monitorare il log del web server in tempo reale con GOACCESS
- Come leggere il log del web server con Excel
In questo tutorial vorrei mostrare come monitorare il log del web server in tempo reale, attraverso la shell SSH ed il comando TAIL, combinato con un paio di altri comandi utili a filtrare righe e colonne del file log.
Il comando TAIL
Il comando tail è un’utilità della riga di comando per l’output dell’ultima parte dei file forniti tramite lo standard input. Scrive i risultati sullo standard output. Per impostazione predefinita, tail restituisce le ultime dieci righe di ogni file fornito e può anche essere usato per seguire un file in tempo reale e guardare mentre vengono scritte nuove righe.
Sintassi
La sintassi base del comando tail è la seguente:
tail [OPTION]... [FILE]...
Vediamo gli argomenti (le opzioni) che possiamo usare con il comando tail:
-c, --bytes=[+]NUM
Tail stampa gli ultimi NUM byte; oppure usa -c + NUM per creare un output che inizia con il byte NUM di ogni file
-f, --follow[={name|descriptor}]
Tail stampa dati aggiunti man mano che il file cresce; un argomento opzione assente significa ‘descriptor’. Con –follow (-f), per impostazione predefinita tail segue il descrittore di file, il che significa che anche se un file monitorato con tail viene rinominato, tail continuerà a seguirne la fine. Questo comportamento predefinito non è utile quando si desidera tenere traccia del nome effettivo del file, non del file descrittore (ad esempio, rotazione del registro). Usa –follow=name in questo caso. Ciò fa sì che tail possa tenere traccia del file anche se rinominato.
-n, --lines=[+]NUM
Tail stampa le ultime NUM righe, invece delle ultime 10; oppure usa -n + NUM per creare un output che inizia con la riga NUM.
--max-unchanged-stats=N
Con –follow=name, riapre un FILE che non ha cambiato dimensione dopo N (default 5) iterazioni per vedere se è stato scollegato o rinominato (questo è il solito caso di file di log ruotati); con inotify, questa opzione è raramente utile.
--pid=PID
Con -f, termina dopo l’ID del processo, il PID v iene terminato.
-q, --quiet, --silent
Tail non produce mai intestazioni che danno i nomi ai file.
--retry
Tail continua a provare ad aprire un file se è inaccessibile.
-s, --sleep-interval=N
Con -f, tail genera una pausa per circa N secondi (default 1.0) tra le iterazioni; con inotify e –pid = P, controlla il processo P almeno una volta ogni N secondi.
-v, --verbose
Tail produce sempre intestazioni che danno i nomi ai file.
-z, --zero-terminated
Il delimitatore di riga è NUL, non di nuova riga.
--help
Tail mostra le informazioni di aiuto e termina il processo.
--version
Tail mostra le informazioni sulla versione e termina il processo.
Esempio pratico per il log del web server
La versione del comando tail che uso più spesso usa il parametro -f oltre chiaramente al percorso del file di log da monitorare:
tail -f /var/log/nginx/access.log
Nel caso nella cartella ci fossero diversi log che vuoi monitorare contemporaneamente puoi usare il carattere jolly – wildcard o metacarattere “*” per comprendere tutti i file che hanno una parte del nome file in comune.
tail -f /var/log/nginx/*access.log
Il comando appena mostrato con il carattere jolly mostra in tempo reale le nuove righe di tutti i log in cartella che hanno “access.log” nel nome file, ad esempio:
- sito-1-access.log
- sito-2-access.log
- sito-3-access.log
TAIL + GREP: filtrare solo le righe desiderate
Per siti molto trafficati, il semplice comando tail genererebbe uno stream di righe troppo veloce, poco utile perché difficilmente leggibile. In tal caso possiamo usare il comando GREP assieme a tail.
Grep è un’utilità della riga di comando per la ricerca di set di dati in testo normale per le righe che corrispondono a un’espressione regolare.
Ad esempio, potremmo voler filtrare solo le righe che contengono la stringa “Googlebot”, oppure di qualsiasi altro user-agent o informazione presente nelle righe del log.
tail -f /var/log/nginx/*access.log | grep Googlebot
TAIL + GREP + AWK: filtrare solo righe e colonne desiderate
Il log del web server è composto da righe che contengono dati divisi da un separatore, come se fossero colonne. In riga troviamo l’IP di chi invia la richiesta, lo status code, l’URL della risorsa richiesta, l’user-agent e diverse altre informazioni che dipendono dalla configurazione di ciascun log.
Una volta che hai capito quali colonne vuoi monitorare puoi usare tail + grep + awk per mostrare solo le righe e le colonne che interessano. Con il seguente comando, tail mostrerebbe solo i dati della prima colonna del log:
tail -f /var/log/nginx/*access.log | grep Googlebot | awk '{print $1}'
Per selezionare più colonne basta separare il valore con una virgola. In questo esempio seleziono le colonne 3 e 7 e, nel mio caso, viene stampato lo status code e la risorsa richiesta:
tail -f /var/log/nginx/*access.log | grep Googlebot | awk '{print $3,$7}'
Nel tuo log probabilmente le colonne status code e risorsa corrispondono a numeri differenti e diversi dai miei, quindi devi fare delle prove. Se questa guida ti è stata utile votala così crescerà in classifica, e se avessi dubbi usa i commenti.