Une chose que je n'ai jamais vue quelqu'un d'autre faire, pour des raisons que je ne peux pas imaginer, est de changer le format du fichier journal Apache en une version plus facilement analysable avec les informations qui comptent vraiment pour vous.
Par exemple, nous n'utilisons jamais l'authentification de base HTTP. Il n'est donc pas nécessaire de consigner ces champs. Je suis intéressé par le temps que chaque demande met à traiter, nous allons donc l'ajouter. Pour un projet, nous voulons également savoir (sur notre équilibreur de charge) si l'un des serveurs traite les demandes plus lentement que les autres, nous enregistrons donc le nom. du serveur que nous mandatons en retour.
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 dire, 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, peut-être montrer des statuts non-200 par exemple, 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 est hotlinking images?" ce serait
if line[6] in ("","-") and "/images" in line[5]:
Pour les comptes IP dans un journal d'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 ceci:
cut -f 3 log | uniq -c | sort -n
Plus facile à lire et à comprendre, et beaucoup moins onéreuse en calcul (sans regex), ce qui, sur des journaux de 9 Go, fait une énorme différence de temps. Lorsque cela devient vraiment intéressant, c'est si vous voulez faire la même chose pour User-agents. Si vos journaux sont délimités par des espaces, vous devez effectuer une recherche d’expression régulière ou une recherche manuelle à la chaîne. Avec ce format, c'est simple:
cut -f 8 log | uniq -c | sort -n
Exactement le même que ci-dessus. En fait, tout résumé que vous voulez faire est essentiellement identique.
Pourquoi est-ce que je dépenserais le processeur de mon système en awk et si grep, quand couper ferait exactement ce que je voulais d'un ordre de grandeur plus rapide?