Actuellement, je suis impliqué dans l'analyse des journaux d'applications en tant que stagiaire chez EXIDEA Co., Ltd., qui développe des outils de rédaction SEO. J'ai donc mis beaucoup de données de journal dans la trame de données Pandas avec le notebook Jupyter. Cependant, j'ai remarqué qu'aucun article n'écrivait simplement sur la méthode. Peu importe combien vous voulez analyser, si vous ne mettez pas les données de journal dans les pandas, rien ne démarrera. Donc, cette fois, je vais réellement expliquer en utilisant les données brutes du journal. Nous allons jeter un coup d'oeil!
・ Collectez les informations souhaitées avec des commandes dans un fichier texte -Stocker le fichier texte dans le bloc de données avec pd.read_csv ()
À titre d'exemple, nous utiliserons le journal d'accès Nginx.
172.17.x.xxx - - [23/Jun/2020:06:25:18 +0900] "GET /xxxxx.js HTTP/1.1" 200 5032 "http://example.net/" "Mozilla/5.0 (iPhone; CPU iPhone OS 13_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) GSA/112.0.316532311 Mobile/15E148 Safari/604.1" "203.0.113.195"
172.17.x.xx - - [23/Jun/2020:06:25:18 +0900] "GET /xxxxx.js HTTP/1.1" 304 0 "http://example.net/" "Mozilla/5.0 (iPhone; CPU iPhone OS 12_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 YJApp-IOS jp.co.yahoo.ipn.appli/4.16.14" "203.0.113.195"
172.17.x.xxx - - [23/Jun/2020:06:25:18 +0900] "GET /xxxxx.js HTTP/1.1" 304 0 "http://example.net/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36" "203.0.113.195"
Cette opération utilise principalement les commandes sed et awk. En tant que flux,
test.txt
WhiskyWhiskyWhisky
Grammaire de base
$ sed 's/Source de remplacement/Après remplacement/g'
ex)
$sed 's/Whisky/Beer/g' test.txt
>>>BeerBeerBeer
Avec cela, vous pouvez formater les données du journal en remplaçant les caractères inutiles par des caractères vides. Dans ce cas, [] et "" vous gêneront lorsque vous les placerez dans la trame de données avec Pandas, alors traitez-les à l'avance.
test.txt
apple orange grape banana
Grammaire de base
$ awk '{imprimer le champ souhaité}'
ex)#Je veux les 1ère et 3ème rangées
$ awk '{print $1,$3}' test.txt
>>> apple grape
Cette fois, je veux l'adresse IP, l'heure, la demande, le chemin, le code d'état, le référent. Extrayez les 1ère, 4ème, 6ème, 7ème et 11ème colonnes.
Le code suivant résume le traitement de la commande.
cat access.log | sed 's/\[//g' -e 's/\]//g' -e 's/"//g' | awk '{print $1,$4,$6,$7,$11}' > test.txt
-D'abord, ouvrez access.log avec la commande cat. (Si vous souhaitez exécuter chaque commande à la fois, connectez-vous avec |.) -Après cela, supprimez [] et "" avec la commande sed. (La commande sed peut être remplacée consécutivement en écrivant -e) ・ Ensuite, extrayez le champ souhaité avec la commande awk. ・ Enfin, convertissez ces access.logs transformés en test.txt
172.17.x.xxx 23/Jun/2020:06:25:18 GET /xxxxx.js 200 http://example.net/
172.17.x.xx 23/Jun/2020:06:25:18 GET /xxxxx.js 304 http://example.net/
172.17.x.xxx 23/Jun/2020:06:25:18 GET /xxxxx.js 304 http://example.net/
Avec le traitement jusqu'à présent, il est devenu un fichier texte qui ne contient que les informations pour lesquelles des données de journal sont souhaitées. De là, cela se termine en un seul coup.
import pandas as pd
columns=["IP","Datetime","method","URI","status","referer"]
df = pd.read_csv('test.txt',delimiter=' ',names=columns) #Le délimiteur est vide
Le résultat est là.
Après cela, vous pouvez effectuer une analyse de séries chronologiques, etc. en effectuant un prétraitement supplémentaire.
La méthode présentée dans cet article est celle que j'ai personnellement trouvée la plus simple. Donc, s'il y a un moyen plus simple, j'apprécierais que vous me le fassiez savoir dans les commentaires.
Recommended Posts