LoginSignup
0
0

More than 1 year has passed since last update.

【Python】膨大な通信ログの調査依頼を自動化してみた

Last updated at Posted at 2021-05-15

このプログラムの趣旨

このプログラムは、膨大なログの中から任意のIPアドレスを探し出すプログラムです。

プログラム作成の背景

・お客さんから特定の通信先(複数個)とのログがないか確認して欲しいと依頼を受ける。
・対象のログフォルダを確認してみると、1ファイルあたり数千行のログファイルが数千個存在。
・手作業でのログ調査をあきらめ、空を見上げる。
・Python触ったことあるし、なんとかしてプログラムで出来ないものか考えてみる。
・作ってみた。

プログラム処理のざっくり概要

・特定のフォルダ内のファイルを時系列順にソート
・ファイルを1つずつ読み込み、リスト化する
・確認したいIPアドレスと、リストの中身を比較する
・リスト内にあれば、見つかった旨をCSVに書き込む

プログラムの中身

log-finder.py
import glob
import csv
import os
import re

'''
「XXXX」フォルダに入っているログに
任意のIPアドレスとの通信がないか確認するプログラムです。

検索したいIPアドレスリストは、「ipaddress_list.csv」に記載してください。

フォルダ構造は以下の通りです。
--XXXX
    |--検索に使用するログファイルたち
--本プログラム
--ipaddress_list.csv

'''

#ファイルの最終更新時刻順にソートする
files = sorted(glob.glob("XXXX"), key=lambda f: os.stat(f).st_mtime, reverse=False)

# フォルダ内のコンフィグを1個ずつ見ていく
for file in files:
    # result.csvに書き込むための定義
    with open('result.csv','a', newline='') as result_csv:

        # 検索しているファイル名の表示
        print(file + 'で検索しています・・・')

        # 検索しているファイル名をCSVに書き込み
        writer = csv.writer(result_csv)

        # コンフィグを読み込んで、スペース区切りでリスト化
        with open(file, mode='r', newline='', encoding='shift-jis', errors="ignore") as config_file:
            lines = [line for line in config_file]
            print('ログファイルを読み込みました')

            # リストを全部結合する
            total_line_list = ''
            for line_list in lines:
                total_line_list += line_list

            # リスト内の要素を区切り文字で区切る
            split_line_list = re.split(' |=|\r\n',total_line_list)
            # print(split_line_list)

        # 検索したいIPリストを記載したCSVファイルを読み込む
        with open('ipaddress_list.csv') as f:
        #csvファイルを2行目から読み込み(ヘッダースキップ)
            reader = csv.reader(f)
            next(reader)
            serch_ipaddress = ''

            for row in reader:
                # 確認したいIPアドレスをリスト化
                serch_ipaddress = row

                # リストを文字列に変換
                mapped_ipaddress = map(str, serch_ipaddress)
                string_converted_ipaddress = ','.join(mapped_ipaddress)

                # IPアドレスがコンフィグ内に存在するか確認
                if string_converted_ipaddress in split_line_list:
                    writer.writerow([file + 'で' + string_converted_ipaddress + 'が見つかりました'])
                else:
                    pass

        writer.writerow([file + 'での検索が完了しました'])

※もっときれいなコードの書き方あるかもしれないけど、部署内にコーディングできる人がいないので完全に自己流です。

ipaddress_list.csv
探したいIPアドレス(この行の読み込みはスキップされます)
192.168.0.1
192.168.0.2
プロンプト画面.
ログファイルを読み込みました
{ログファイル#1}で検索しています・・・
ログファイルを読み込みました
{ログファイル#2}で検索しています・・・
ログファイルを読み込みました
{ログファイル#3}で検索しています・・・

result.csv
{ログファイル#1}での検索が完了しました
{ログファイル#2}での検索が完了しました
{ログファイル#3}での検索が完了しました
{ログファイル#3}で192.168.0.1が見つかりました

あとはこれをpyinstallerでexeファイルにして、1クリックで実行できるようにしたら完了。

同じ依頼が数か月後も来たため、プログラム作成しておいてよかったと心の底から思ったのでした。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0