Una cosa che non ho mai visto fare a nessun altro, per motivi che non riesco a immaginare, è cambiare il formato del file di registro di Apache in una versione più facilmente analizzabile con le informazioni che contano davvero per te.
Ad esempio, non utilizziamo mai l'autenticazione di base HTTP, quindi non è necessario registrare tali campi. Mi sono interessato a quanto tempo ogni richiesta prende a servire, quindi dovremo aggiungere che in. Per un progetto, vogliamo anche sapere (il nostro bilanciamento del carico) se tutti i server stanno servendo le richieste più lento rispetto ad altri, in modo da registrare il nome del server a cui stiamo eseguendo il proxy.
Ecco un estratto dalla configurazione di Apache di un server:
# We don't want to log bots, they're our friends
BrowserMatch Pingdom.com robot
# Custom log format, for testing
#
# date proto ipaddr status time req referer user-agent
LogFormat "%{%F %T}t %p %a %>s %D %r %{Referer}i %{User-agent}i" standard
CustomLog /var/log/apache2/access.log standard env=!robot
Ciò che non puoi davvero dire da questo è che tra ogni campo c'è un carattere di tabulazione letterale (\ t). Ciò significa che se voglio fare qualche analisi in Python, magari per esempio mostrando stati non 200, posso farlo:
for line in file("access.log"):
line = line.split("\t")
if line[3] != "200":
print line
O se volessi fare "chi è hotlinking delle immagini?" sarebbe
if line[6] in ("","-") and "/images" in line[5]:
Per i conteggi IP in un registro di accesso, l'esempio precedente:
grep -o "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}" logfile | sort -n | uniq -c | sort -n
diventa qualcosa del genere:
cut -f 3 log | uniq -c | sort -n
Più facile da leggere e comprendere, e molto meno costoso dal punto di vista computazionale (senza regex) che, su registri da 9 GB, fa un'enorme differenza nel tempo impiegato. Quando questo diventa DAVVERO pulito è se si desidera fare la stessa cosa per gli User-agent. Se i log sono delimitati da spazi, è necessario eseguire manualmente una corrispondenza delle espressioni regolari o la ricerca di stringhe. Con questo formato, è semplice:
cut -f 8 log | uniq -c | sort -n
Esattamente come sopra. In effetti, qualsiasi riepilogo che vuoi fare è essenzialmente lo stesso.
Perché mai dovrei spendere la CPU del mio sistema su awk e grep quando il taglio farà esattamente quello che voglio ordini di grandezza più velocemente?