Pythonでログ比較(2) ~ログ比較編~

ベル

今回の授業は、前回抽出した『事前ログと事後ログをPythonで比較』してみたいと思います。比較するにあたっていくつかの注意点もありますので、しっかり読んで学習してもらえればと思います。まだ、前回の授業を受けていない方は、こちらから。

 

Pythonでログ比較(1) ~ログ抽出編~

 

前提条件

前回の授業では、事前ログと事後ログから比較したいログだけを抽出しました。その抽出された事前ログと事後ログを比較するための前提条件を確認していきましょう。

 

 

比較したいログの抽出

これは前回のログ抽出マクロを実行していれば問題ないのですが、間違って事前ログだけしか抽出していない状態ですともちろん比較は出来ません。そのため実行する前には、両方が抽出されていることを確認してくださいね!

 

比較したいログのファイル名

この比較マクロは、事前のファイル名を使っています。そのため事前にあって事後にファイルがないとエラーになります。『03_事前ログ抽出』にあって『04_事後ログ抽出』にないような機器のログは、どこかに避難させておいてくださいね。

 

 

Pythonの作成

それでは、前提条件に従ってコードを書いていこうと思います。

 

インポートの指定

前回同様、モジュールをなるべく使用しないでいきたいので、今回はOSモジュールだけをインポートしておきたいと思います。

 

import os

 

ログ保存先の指定

次に、事前ログと事後ログから比較対象コマンドの結果だけを抽出したログを使いますので、事前に保存しているディレクトリを宣言しておきます。この保存先の指定は、相対パスで指定できるので、Pythonファイルが保存されている場所からの指定をしておきます。前回のログ抽出編で紹介したのと同じやり方となります。

 

bf_dir = os.listdir(’03_事前ログ抽出/’)
af_dir = os.listdir(’04_事後ログ抽出/’)

 

 

比較した機器のホスト名書き込み

まず、『03_事前ログ抽出』ディレクトリからファイル名を読み込みホスト名だけを抽出して、『のCDP比較結果』と組み合わせます。その後、『CDPの比較結果.txt』をオープンして、先程の文章を追記します。『RT1』というルータがあったとすれば、『RT1のCDP比較結果』という文字列を『CDPの比較結果.txt』に書き込むことになります。

 

for bf_log in bf_dir:
    host = bf_log.split(‘_’)
    host_name = host[0] + ‘のCDP比較結果’
    with open(‘CDPの比較結果.txt’, ‘a’) as wr_mem:
        wr_mem.write(\n + host_name + \n)

 

 

事前ログ抽出ファイルの名前をリスト化

先程、『03_事前ログ抽出』ディレクトリに保存されているファイル名を変数『bf_log』に入れたと思います。これを『03_事前ログ抽出/』と組み合わせてパスを作成します。事後も同様に、『03_事前ログ抽出』のファイル名を使ってパスを作成します。ここでポイントなるのが、事前ログ抽出のファイル名を使っていることです。ここで同じファイル名でパスを作ることで、同じ機器同士の比較が可能となるのです。

 

その後に、この『03_事前ログ抽出』までのパス(bf_file)を使って関数『line_set』を呼び出します。関数の結果を変数『bf』に代入させて後の処理で使います。これを『04_事後ログ抽出』でも同様の処理をさせるようにしています。

 

    bf_file = ’03_事前ログ抽出/’ + bf_log
    af_file = ’04_事後ログ抽出/’ + bf_log

    bf = line_set(bf_file)
    af = line_set(af_file)

 

 

ファイルから1行ずつ読み込む

それでは呼び出された関数を見てみましょう。『def』と書かれたコードが関数となります。このようにしておくことで繰り返しの処理が必要な際に何度も同じコードを書かなくて済むようになります。覚えておきましょうね!

 

今回は、ファイル名を取得してファイルをオープンしたら1行ずつ読み込み、変数『sets』に代入して呼び出されたコードに返すようにします。

 

def line_set(file):
    with open(file, ‘r’) as f:
    lines = f.readlines()
    sets = set(lines)
    return sets

 

 

事前と事後の比較

それでは事前と事後の比較をしましょう。まずは、『事前ログにあって事後ログにないもの』がないかについて確認していきます。もし差分があれば、変数『bf_results』に入れていきます。ここで使うのが『difference』を使って差分を見つけます。同様に『事後にあって事前にないもの』がないかについても確認し、差分があれば『af_results』に入れます。

 

    bf_results = bf.difference(af)
    af_results = af.difference(bf)

 

 

差分結果の表示

ここまでで差分の結果が出ましたね。その結果をテキストに出力したいと思います。以下のコードで確認してもらえればわかるかと思いますが、もし変数『bf_results』が空っぽであれば、『事前ログにあって事後ログにないもの』がないということになります。そうであれば、先程の『CDPの比較結果.txt』に『事前ログにあるログはすべて事後にあります。』と入力するようにしています。ここでの言葉は自分でわかるように変更してもらえればと思います。

 

もし、差分があれば『事後で減っているログがあります。』とコメントを入力した後に、先程の差分結果『bf_results』から抜き出して書き込むようにします。この処理を事前と事後の差分、事後と事前の差分を繰り返し処理するようにします。

 

    if not bf_results:
        with open(‘CDPの比較結果.txt’, ‘a’) as wr_mem:
            wr_mem.writelines(‘事前にあるログはすべて事後にあります。\n)

    else:
        with open(‘CDPの比較結果.txt’, ‘a’) as wr_mem:
        wr_mem.writelines(‘事後で減っているログがあります。\n)

    for bf_result in bf_results:
        with open(‘CDPの比較結果.txt’, ‘a’) as wr_mem:
            wr_mem.writelines(bf_result)

 

ここまでで学んだことをフルセットで書いていくと今回の比較が可能となります。

 

コードの紹介

最後に今回の比較マクロで使用するコードをすべて書いておきます。ここまでの復習もかねて、読み込んでいってください。

 

import os

bf_dir = os.listdir(’03_事前ログ抽出/’)
af_dir = os.listdir(’04_事後ログ抽出/’)

def line_set(file):
    with open(file, ‘r’) as f:
    lines = f.readlines()
    sets = set(lines)
    return sets

for bf_log in bf_dir:
    host = bf_log.split(‘_’)
    host_name = host[0] + ‘のCDP比較結果’
    with open(‘CDPの比較結果.txt’, ‘a’) as wr_mem:
        wr_mem.write(\n + host_name + \n)

    bf_file = ’03_事前ログ抽出/’ + bf_log
    af_file = ’04_事後ログ抽出/’ + bf_log

    bf = line_set(bf_file)
    af = line_set(af_file)

    bf_results = bf.difference(af)
    af_results = af.difference(bf)

    if not bf_results:
        with open(‘CDPの比較結果.txt’, ‘a’) as wr_mem:
            wr_mem.writelines(‘事前にあるログはすべて事後にあります。\n)

    else:
        with open(‘CDPの比較結果.txt’, ‘a’) as wr_mem:
        wr_mem.writelines(‘事後で減っているログがあります。\n)

    for bf_result in bf_results:
        with open(‘CDPの比較結果.txt’, ‘a’) as wr_mem:
            wr_mem.writelines(bf_result)

    if not af_results:
        with open(‘CDPの比較結果.txt’, ‘a’) as wr_mem:
            wr_mem.writelines(‘事後にあるログはすべて事前にあります。\n)

    else:
        with open(‘CDPの比較結果.txt’, ‘a’) as wr_mem:
            wr_mem.writelines(‘事後で増えているログがあります。\n)

    for af_result in af_results:
        with open(‘CDPの比較結果.txt’, ‘a’) as wr_mem:
            wr_mem.writelines(af_result)

 

 

まとめ

ベル

今回の授業はいかがだったでしょうか?これでCDPのログ比較はできると思います。実は、CDP以外にも完全一致で比較するログは、抽出時に少し工夫するだけで、大体比較できるようになっているんです。比較時に邪魔になる時間やカウンター的な数値などを削除して抽出しておけば、このままのマクロで使えます。ぜひ、試してみてください。

 

【Pythonプログラミングのツボとコツがゼッタイにわかる本】

Pythonプログラミングのツボとコツがゼッタイにわかる本

新品価格
¥2,916から
(2018/7/4 22:36時点)

【詳細! Python 3 入門ノート】

詳細! Python 3 入門ノート

新品価格
¥2,894から
(2018/7/4 22:29時点)

【退屈なことはPythonにやらせよう】

退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング

新品価格
¥3,996から
(2018/7/4 22:46時点)

Follow me!

Pythonでログ比較(2) ~ログ比較編~” に対して1件のコメントがあります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です