LoginSignup
43
48

More than 5 years have passed since last update.

ログ解析を爆速で行うPythonテンプレ

Posted at

あらまし

仕事中、開発機から出力される、 自分以外の人が入れた フリーフォーマットなログを解析することがよくある。
毎回それに合わせてログ解析コードを書くわけだが、何度もログ解析をするうちに捗るテンプレートとテクニックができたので展開する。

テンプレートコード

#!/usr/bin/env python3

import sys,re

for line in sys.stdin: # 標準出力から読み込む
    line = line.strip() # 行頭、行末の空白、改行は削っておく
    print(line)

たったこれだけ!

上記コードはPython3で書かれているが、Python2でもShebangとprint関数がprint文になる以外は変わらない。

使用例とテクニック

テンプレを用いて、行の解析や集計を行ってみる。

#!/usr/bin/env python3

import sys,re # 標準入力、正規表現を扱う

# 行をまたぐ情報はここで宣言した変数に格納する。
hoge_count = 0

# 行ごとにループを回す
for line in sys.stdin:
    line = line.strip()
    # print(line) # デバッグ用、要らなければコメントアウトする

    # 特定の文字列で始まる行を探すなら、正規表現より.startwith()が便利
    if line.startswith('hoge'):
      hoge_count += 1

    if line.startswith('fuga'):
      # 次の行を先読みしたいなら、.readline()を呼ぶ
      next_line = sys.stdin.readline().strip()
      print("next to fuga =", next_line)

    # 空白やカンマ区切りは.split()を使う
    if line.startswith('moge'):
       moge_cols = line.split(' ')
       print("moge line cols =", moge_cols)

    # 複雑なマッチは正規表現を使う
    m = re.match('(.*)_muga_(.*)', line)
    if m:
       print("muga line left: ", m.group(1), "right:", m.group(2))

# 集計結果の出力
print("hoge_count =", hoge_count)

こんな入力を食わせてみる。

input.txt
hoge1
hoge2
fuga
next fuga
moge 1 2 3
left_muga_right
実行
$ python3 analyze.py < input.txt

こんな入力が得られる。

output
next to fuga = next fuga
moge line cols = ['moge', '1', '2', '3']
muga line left:  left right: right
hoge_count = 2

同じく、Python2でも同等のコードは記述可能である。

まとめ

5分でログ解析を行うためのコードテンプレートとテクニックを紹介した。
Python3で記述したが、Python2でも可能である。

43
48
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
43
48