Pythonでログ解析(3) 〜ログの読み込みからCSVファイルの作成まで〜
今回の授業は、『ログの読み込みからCSVファイルの作成まで』を教えていきます。よくネットワークエンジニアとして仕事していると、大量のログを取るだけ取って内容を見ないなんてことがありますが、必要な物はちゃんと見なければいけません。そんな時に使ってもらえたら嬉しいです。
前回までの授業で、Pythonのインストールと開発環境の構築が終わりました。いよいよ、プログラミングを書いていくわけですが、プログラムの流れを先に考えておこうと思います。今回のプログラムでやりたいことであるログ解析ですが、まずは、具体的に取りたいログを決めましょう。まだ前回までの授業を受けていない方は、こちらからどうぞ。
Pythonでログ解析(2) ~パソコンにPythonを入れるまで~
それでは、前回の続きとしていよいよプログラムを書いていきましょう!
Contents
抽出したいデータの具体化
まずは、どんなコマンドで何のデータを抽出したいのかを明確にしましょう。以下のような手順で考えてみるといいと思います。
① コマンドの選定
show interface fastethernet 0
② 抽出したい行の選定
Time source is user configuration, 00:00:00.963 UTC Sun Jul 1 2018
5 minute output rate 2367 bits/sec, 21 packets/sec
③ 抽出したい値の選定
Time source is user configuration, 00:00:00.963 UTC Sun Jul 1 2018
5 minute output rate 2367 bits/sec, 21 packets/sec
これを決めておくことで、具体的に何を取得したいのかを明確になり、プログラムを書く上で重要になります。
フォルダ構成の検討
今回は、Python プログラムファイル以外に、定期取得したログファイルと出力されるcsvファイルがあります。以下のフォルダ構成にしたいと思いますので、環境を作っておいてください。この「make_cav_file.py」がPythonの実行ファイルになるのと、「log」フォルダの中にあるテキストファイルが定期的に取得したログファイルになります。
Pythonコードの紹介
それでは、いきなりですがPythonのコードを紹介してしまいますね。
import glob
import os
import csv
# 2018年7月1日のログから抽出
days = ‘20180701’
DATA_DIR = (‘./log/’ + days)
# /log/20180701の配下に保存されているテキストファイルを変数「files」に入れる
files = glob.glob(os.path.join(DATA_DIR, ‘*.txt’))
# 「files」から1ファイルずつOpenしていく
for file in files:
with open(file) as f:
# openしたファイルから1行ずつ読み込んでいく
lines = f.readlines()
lines_strip = [line.strip() for line in lines]# ログ取得時間の取得
# 「Time source is user configuration」という文字が含まれている行を抜き出して
# 変数「l_time」に代入する
l_time = [line for line in lines_strip if ‘Time source is user configuration’ in line]
# 「l_time」の中に保存された1行を空白セルで区切る
# 例)「Time source is user configuration, 00:00:00.963 UTC Sun Jul 1 2018」
time_sp = str(l_time).split(‘ ‘)
# 空白セルで区切られた1行から6月番目だけを抽出し、「time」に代入する
time = time_sp[5::6]#Outputデータ量の取得
# 「5 minute output rate」という文字が含まれている行を抜き出して
# 変数「l_opt」に代入する
l_opt = [line for line in lines_strip if ‘5 minute output rate’ in line]
# 「l_opt」の中に保存された1行を空白セルで区切る
# 例)「5 minute output rate 2367 bits/sec, 21 packets/sec」
opt_sp = str(l_opt).split(‘ ‘)
# 空白セルで区切られた1行から5月番目だけを抽出し、「opt」に代入する
opt = opt_sp[4::5]i = 0
for tm in time:
# 先程抽出した、変数「time」と変数「opt」を組み合わせて「table」に代入していく
# 間に「,」を入れることでcsv化した時に列を分割させる
table = (tm, ‘,’, opt[i])
# 日付入りのCSVファイルを作成する
# オプションで「a」を選択することで上書きモードでオープン
f_log = open(days + ‘_log_data.csv’, ‘a’)
# csvファイルに先程の「table」を書き込む
f_log.writelines(table)
# 「’\n’」を入れることで改行させる
f_log.writelines(‘\n‘)
# 次のデータに進む
i += 1
# csvファイルを閉じる
f_log.close()
これを任意のファイル名にして拡張子を「.py」にすれば、データからcsvファイルを作成してくれるはずです。とりあえず、「make_csv_file.py」として実行してみてください。以下のように出力されていればOKです。もし、作成されないようでしたら、フォルダ構成やモジュールの有無などを確認してみてください。
コードの解説
フォルダを作成してコードをコピーして貼り付けるだけでは、何の勉強にもなりませんので、少しでも解説させてもらいます。
モジュールのインポート
まず最初に行っているのがモジュールのインポートです。以前の授業でモジュールをインストールしたかと思いますが、インストールしたらPythonで使えるわけではないのです。プログラムを書く際に使用するモジュールをインポートする必要があります。今回は以下の3つを使用します。
import glob
import os
import csv
これらのモジュールの機能は以下になります。
このように、プログラムで使用するモジュールを事前に定義しておきましょう。
テキストファイルの読み込み
モジュールのインポートが終わったら、実際に取得したテキストファイルの読み込みを実施していきましょう。最初に定義したフォルダ構成を思い出してください。Pythonファイルの保存ディレクトリから見て、以下の場所にログファイルが保存されているはずです。
./log/20180701/
そのログが保存されている場所を指定して、ディレクトリ内のすべてのテキストファイルを順に読み込むようにしていきます。
※今回はプログラムの中に「20180701」と明記していますが、次回以降に任意の場所を入力できるようにします。ここでは、一旦このままでいきます。
# 2018年7月1日のログから抽出
days = ‘20180701’
DATA_DIR = (‘./log/’ + days)
# /log/20180701の配下に保存されているテキストファイルを変数「files」に入れる
files = glob.glob(os.path.join(DATA_DIR, ‘*.txt’))
データ抽出
先程、読み込んだファイルから必要な情報を抽出していきます。今回は、「時間」と「データ量」の抽出が目的となるので、それぞれを変数「time」と「opt」に入れていくようにしています。具体的なコマンドの中身については、コードの途中に「#」に続けてコメントを書かせてもらっているので、それを見てもらえればわかると思います。
ちなみに「#」から右側がコメントと判断されるので、コードの内容についてコメントを残すようにしましょうね。後で見直したときに苦労することになるので。
# 「files」から1ファイルずつOpenしていく
for file in files:
with open(file) as f:
# openしたファイルから1行ずつ読み込んでいく
lines = f.readlines()
lines_strip = [line.strip() for line in lines]# ログ取得時間の取得
# 「Time source is user configuration」という文字が含まれている行を抜き出して
# 変数「l_time」に代入する
l_time = [line for line in lines_strip if ‘Time source is user configuration’ in line]
# 「l_time」の中に保存された1行を空白セルで区切る
# 例)「Time source is user configuration, 00:00:00.963 UTC Sun Jul 1 2018」
time_sp = str(l_time).split(‘ ‘)
# 空白セルで区切られた1行から6月番目だけを抽出し、「time」に代入する
time = time_sp[5::6]#Outputデータ量の取得
# 「5 minute output rate」という文字が含まれている行を抜き出して
# 変数「l_opt」に代入する
l_opt = [line for line in lines_strip if ‘5 minute output rate’ in line]
# 「l_opt」の中に保存された1行を空白セルで区切る
# 例)「5 minute output rate 2367 bits/sec, 21 packets/sec」
opt_sp = str(l_opt).split(‘ ‘)
# 空白セルで区切られた1行から5月番目だけを抽出し、「opt」に代入する
opt = opt_sp[4::5]
csvファイルへの書き込み
最後にログファイルから抽出したデータをcsvファイルに書き込みましょう。時間データを読み込んだ変数「time」を順番に抽出して新しく変数「tm」に入れます。そして、同ファイルに含まれていたトラフィックデータ「opt」を組み合わせて、csvファイルに書き込みます。
i = 0
for tm in time:
# 先程抽出した、変数「time」と変数「opt」を組み合わせて「table」に代入していく
# 間に「,」を入れることでcsv化した時に列を分割させる
table = (tm, ‘,’, opt[i])
# 日付入りのCSVファイルを作成する
# オプションで「a」を選択することで上書きモードでオープン
f_log = open(days + ‘_log_data.csv’, ‘a’)
# csvファイルに先程の「table」を書き込む
f_log.writelines(table)
# 「’\n’」を入れることで改行させる
f_log.writelines(‘\n‘)
# 次のデータに進む
i += 1
# csvファイルを閉じる
f_log.close()
これをファイルの数だけ繰り返すことで、すべてのデータが抽出されることになりますね。それが終わったらcsvファイルを閉じて完了です。たったこれだけのコードだけで何千ものファイルがあったとしても数秒で抽出することができるのです。
まとめ
今回の授業はいかがだったでしょうか?Pythonを初めて2週間で書いたコードですので、もっとスマートな書き方もあると思います。また例外処理もしていないので、エラーが発生したら止まってしまうこともあると思います。もう少し勉強が進んだらリライトしていきますので、ご容赦ください。
それでは、次回以降も続きを書いていきますのでお楽しみに~♪
番外編でTera Termで定期的にログ取得するマクロを紹介しています。こちらも勉強しておきましょう!
商品紹介
ネットワークエンジニアとして仕事していく上で、必要となる商品を紹介させていただいています。よかったら、こちらも読んでみてください。きっと何か面白いものが見つかると思いますよ!
“Pythonでログ解析(3) 〜ログの読み込みからCSVファイルの作成まで〜” に対して5件のコメントがあります。