Une chose que je n'ai jamais vu quelqu'un d'autre faire, pour des raisons que je ne peux pas imaginer, est de changer le format du fichier journal d'Apache pour une version plus facilement analysable avec les informations qui vous importent vraiment.
Par exemple, nous n'utilisons jamais l'authentification de base HTTP, nous n'avons donc pas besoin d'enregistrer ces champs. I Je suis intéressés par le temps que prend chaque requête pour être servie, nous allons donc l'ajouter. Pour un projet, nous voulons également savoir (sur notre équilibreur de charge) si certains serveurs servent les demandes plus lentement que d'autres, nous enregistrons donc le nom du serveur auquel nous renvoyons par proxy.
Voici un extrait de la configuration apache d'un serveur :
# 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
Ce que vous ne pouvez pas vraiment voir, c'est qu'entre chaque champ se trouve un caractère de tabulation littéral ( \t ). Cela signifie que si je veux faire une analyse en Python, par exemple montrer les statuts non-200, je peux le faire :
for line in file("access.log"):
line = line.split("\t")
if line[3] != "200":
print line
Ou si je voulais faire "qui fait du hotlinking ?", ce serait
if line[6] in ("","-") and "/images" in line[5]:
Pour le décompte des IP dans un journal des accès, l'exemple précédent :
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
devient quelque chose comme ça :
cut -f 3 log | uniq -c | sort -n
Plus facile à lire et à comprendre, et beaucoup moins coûteux en termes de calcul (pas de regex), ce qui, sur des journaux de 9 Go, fait une énorme différence en termes de temps. Si vous voulez faire la même chose pour les agents utilisateurs, cela devient VRAIMENT intéressant. Si vos journaux sont délimités par des espaces, vous devez effectuer une correspondance par expression régulière ou une recherche de chaîne à la main. Avec ce format, c'est simple :
cut -f 8 log | uniq -c | sort -n
Exactement la même chose que ci-dessus. En fait, tout résumé que vous voulez faire est essentiellement identique.
Pourquoi diable dépenserais-je l'unité centrale de mon système pour awk et grep alors que cut fera exactement ce que je veux plusieurs fois plus vite ?