Je peux utiliser des analyseurs de journaux, mais il me faut souvent analyser les journaux Web récents pour voir ce qui se passe actuellement.
Je fais parfois des choses comme trouver le top 10 des ips qui demandent un certain fichier
cat foo.log | grep request_to_file_foo | awk '{print $1}' | sort -n | uniq -c | sort -rn | head
Qu'est-ce que vous avez dans votre boîte à outils?
Réponses:
Vous pouvez faire à peu près n'importe quoi avec les fichiers journaux Apache avec awk seul. Les fichiers journaux Apache sont essentiellement séparés par des espaces, vous pouvez prétendre que les guillemets n'existent pas et accéder à toutes les informations qui vous intéressent par le numéro de colonne. Le seul cas où cela se produit est que si vous avez le format de journal combiné et que vous êtes intéressé par les agents utilisateurs, vous devez alors utiliser des guillemets (") comme séparateur et exécuter une commande awk distincte. Vous trouverez ci-dessous les adresses IP de chaque utilisateur qui demande la page d'index trié par nombre d'occurrences:
7 $ est l'URL demandée. Vous pouvez ajouter les conditions souhaitées au début. Remplacez le '$ 7 == "/" par les informations de votre choix.
Si vous remplacez le $ 1 dans (ipcount [$ 1] ++), vous pouvez regrouper les résultats selon d'autres critères. Utiliser $ 7 montrerait quelles pages ont été consultées et à quelle fréquence. Bien sûr, vous voudriez alors changer la condition au début. Ce qui suit montrerait quelles pages ont été consultées par un utilisateur à partir d'une adresse IP spécifique:
Vous pouvez également diriger la sortie par le biais du tri pour obtenir les résultats dans l'ordre, soit dans le cadre de la commande shell, soit également dans le script awk lui-même:
Ce dernier serait utile si vous décidiez d'étendre le script awk pour imprimer d'autres informations. Tout dépend de ce que vous voulez savoir. Ceux-ci devraient servir de point de départ pour tout ce qui vous intéresse.
la source
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:
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:
Ou si je voulais faire "qui est hotlinking images?" ce serait
Pour les comptes IP dans un journal d'accès, l'exemple précédent:
devient quelque chose comme ceci:
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:
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?
la source
cut -f 3 log | uniq -c | sort -n
des agents utilisateurscut -f 8 log | uniq -c | sort -n
.Oubliez awk et grep. Consultez asql . Pourquoi écrire des scripts illisibles lorsque vous pouvez utiliser SQL comme syntaxe pour interroger le fichier journal. Par exemple.
la source
Voici un script permettant de rechercher les principales URL, principaux référents et principaux agents utilisateurs parmi les N entrées de journal récentes.
La source
la source
pour les comptes IP dans un journal d'accès:
C'est un peu moche, mais ça marche. J'utilise aussi ce qui suit avec netstat (pour voir les connexions actives):
Ils sont certains de mes "one liners" préférés :)
la source
Construire une liste de questions courantes constituerait un excellent index pour répondre à cette question. Mes questions communes sont:
Je remarque de tels changements en surveillant les pages d'état du serveur (via mod_status) pour connaître le temps de réponse et le temps de réponse approximatif pour les demandes actives et récemment complétées (sachant pertinemment que je manque une énorme pile de données, mais que les échantillons sont assez bons).
J'utilise la directive LogFormat suivante (le% T est vraiment utile)
Je cherche la cause à effet et ce qui s'est passé en premier ... généralement sur des sous-ensembles spécifiques de modèles dans mes journaux, j'ai donc besoin de connaître les informations suivantes pour tout modèle / expression régulière donné:
J'utilise généralement perl, car il devient finalement assez complexe pour en valoir la peine.
Un exemple non perl serait un taux de réussite rapide par minute pour les codes de statut autres que 200:
Oui, je triche avec ce grep, en supposant qu'un quote-espace-200-espace ne correspond qu'à des codes de statut http ... peut utiliser awk ou perl pour isoler le champ, mais gardez à l'esprit qu'il peut être inexact.
Un exemple plus complexe en perl pourrait consister à visualiser un changement de taux de hit pour un motif.
Le script ci-dessous a beaucoup à mâcher, en particulier si vous ne connaissez pas perl.
le code suit:
Si vous souhaitez simplement traiter des métriques standard, passez à la caisse.
la source
Ici, mon exemple 'sed', il lit le format par défaut des journaux Apache et le convertit en un format plus pratique pour le traitement automatique. La ligne entière est définie comme une expression régulière, les variables sont enregistrées et écrites en sortie avec '#' comme séparateur.
La notation simplifiée de l'entrée est la suivante:% s% s% s [% s] "% s"% s% s "% s" "% s"
Exemple de ligne de saisie: xx.xx.xx.xx - - [29 / Mar / 2011: 12: 33: 02 +0200] "GET /index.html HTTP / 1.0" 200 9443 "-" "Mozilla / 4.0"
Exemple de ligne de sortie: xx.xx.xx.xx # - # - # 29 / mars / 2011: 12: 33: 02 + 0200 # GET /index.html HTTP / 1.0 # 200 # 9443 # - # Mozilla / 4.0
Ressentez le pouvoir des expressions régulières :-)
la source
J'utilise beaucoup awk en traînant ou en catantant le fichier. Chaque soir, je me livre un rapport Web pour chaque serveur. En fonction de votre fichier journal et de votre LogFormat, vous devrez éditer quelques uns des liners pour travailler pour vous ...
Voici un exemple simple:
Si je souhaite modifier les journaux sur mon serveur pour seulement les codes d'état 404/500, je procéderais comme suit:
<snip>
</ snip>
la source
Qui relie vos images à chaud:
la source
Ce que j'ai tendance à faire le plus souvent est de lire des sections d'un journal en fonction du temps. J'ai donc écrit le script suivant en utilisant sed pour extraire la période qui m'intéresse. Cela fonctionne pour tous les fichiers du journal que je viens. across et peut également gérer les journaux archivés.
la source
Bien que ce ne soit pas sed ou awk, il y a deux choses que j'ai trouvées utiles pour gérer les fichiers journaux Apache et icecast.
AWStats a un script très utile appelé logresolvemerge.pl qui combine plusieurs fichiers journaux compressés ou non compressés, supprime les dupes et les trie par horodatage. Il peut également effectuer des recherches DNS et être configuré pour exécuter des processus multithread. C'est particulièrement utile lorsque vous utilisez awstats, car awstats ne peut pas ajouter de lignes de journal avec des horodatages plus anciens que la base de données actuelle. Vous devez donc tous les ajouter dans l'ordre, mais c'est très simple, car vous n'avez qu'à tout jeter à logresolvemerge.pl et que tout s'affiche correctement.
sed et awk gèrent mal les dates car ils les traitent généralement comme des ficelles. awk a quelques fonctions de date et d’heure, mais elles n’ont pas beaucoup à faire. Par exemple, l'extraction d'une plage de lignes entre deux horodatages est difficile si ces horodatages exacts ne se produisent pas dans le fichier (même si les valeurs entre eux le sont) - l'exemple de Chris a exactement ce problème. Pour remédier à cela, j'ai écrit un script PHP qui indique les plages d'horodatage des fichiers journaux et peut également extraire un bloc par plage d'horodatage, en utilisant n'importe quel format de date ou d'heure (le format d'horodatage du fichier journal n'a pas besoin de l'être).
Pour conserver ce sujet, voici quelques astuces utiles: Obtenez le nombre total d'octets servis à partir du journal apache ou icecast:
Obtenez le nombre total de secondes connectées à partir d'un journal icecast:
la source
La récupération de ce vieux fil, après avoir abandonné sur asql pour les grands fichiers journaux, regardé une solution againg, également serverfault, je l' ai trouvé au sujet WTOP ici il est un outil opensource, qui est capable de faire la surveillance en direct ou les journaux processus et obtenir des statistiques (top N), très flexible et puissant, la place officielle est ici
la source