2017-12-24 24 views
2

私は、スマートなログシステムを構築しています。そこでは、サーバーへの接続確立時間の開始と停止のような顧客接続を監視できます。接続ログシステムを構築する

RAW LOG

Dec 19 00:00:03 172.16.20.24 pppoe,ppp,info <pppoe-customer1>: terminating... - peer is not responding 
Dec 19 00:00:03 172.16.20.24 pppoe,ppp,info,account customer1 logged out, 4486 1009521 23444247 12573 18159 
Dec 19 00:00:03 172.16.20.24 pppoe,ppp,info <pppoe-customer1>: disconnected 
Dec 19 00:00:07 172.16.20.24 pppoe,info PPPoE connection established from 60:E3:27:A2:60:09 
Dec 19 00:00:08 172.16.20.24 pppoe,ppp,info,account customer2 logged in, 10.171.3.185 
Dec 19 00:00:08 172.16.20.24 pppoe,ppp,info <pppoe-customer2>: authenticated 
Dec 19 00:00:08 172.16.20.24 pppoe,ppp,info <pppoe-customer2>: connected 
Dec 19 00:00:13 172.16.20.24 pppoe,info PPPoE connection established from C0:25:E9:7F:C0:41 
Dec 19 00:00:14 172.16.20.24 pppoe,ppp,error <ccfa>: user customer3 authentication failed 
Dec 19 00:00:32 172.16.20.24 pppoe,info PPPoE connection established from C0:25:E9:7F:C0:41 
Dec 19 00:00:36 172.16.20.24 pppoe,ppp,error <ccfb>: user customer3 authentication failed 
Dec 19 00:01:06 172.16.20.24 pppoe,info PPPoE connection established from C0:25:E9:7F:C0:41 

私にとって重要なのです:とキャプチャラインがを接続し、文字列を切断しました。それは最も優秀な正規表現ではありませんので、私はまだ学んでいる

import os 
import re 
import sys 

f = open('log.log','r') 
log = [] 
for line in f: 
if re.search(r': connected|: disconnected',line): 
    ob = dict() 
    ob['USER'] = re.search(r'<pppoe(.*?)>',line).group(0).replace("<pppoe-","").replace(">","") 
    ob['DATA'] = re.search(r'^\w{3} \d{2} \d{2}:\d{2}:\d{2}',line).group(0) 
    ob['CONNECTION'] = re.search(r': .*',line).group(0).replace(": ", "") 
    log.append(ob) 

が、それは大丈夫だ:

私はこれを得ました! は、このログリストを絞り込む今を必要とするこのサンプルに取得したい:

{"connection" : [{ 
"start" : "Dec 19 10:12:58", 
"username" : "customer2"} 

{"connection" : [{ 
"start" : "Dec 20 10:12:58", 
"username" : "customer1"} 

{"connection" : [{ 
"start" : "Dec 19 10:12:58", 
"stop" : Dec 22 10:04:35", 
"username" : "customer4"} 

{"connection" : [{ 
"start" : "Dec 19 10:12:58", 
"stop" : "Dec 24 10:04:35" 
"username" : "customer3"} 

私の障害、

  • がRAWログインが絶えず生成されている、私はすでにあれば、いくつかの ユーザーを識別する必要があります存在する。 はい:接続を更新します(顧客2は接続を削除し、登録が必要です)。ただし、接続が切断された場合はどうなりますか?たとえば、

Dec 19 10:20:58 172.16.20.24 pppoe,ppp,info <pppoe-customer2>: disconnected  
Dec 19 01:00:36 172.16.20.24 pppoe,ppp,error <ccfb>: user customer3 authentication failed 
Dec 19 01:01:06 172.16.20.24 pppoe,info PPPoE connection established from C0:25:E9:7F:C0:41 
Dec 19 10:21:38 172.16.20.24 pppoe,ppp,info <pppoe-customer2>: authenticated 
Dec 19 10:21:48 172.16.20.24 pppoe,ppp,info <pppoe-customer2>: connected 
Dec 19 10:22:38 172.16.20.24 pppoe,ppp,info <pppoe-customer3>: authenticated 
Dec 19 10:22:58 172.16.20.24 pppoe,ppp,info <pppoe-customer2>: disconnected 

まず切断、それを追加するのは簡単。

{"connection" : [{ 
"start" : "Dec 19 10:12:58" 
"stop" : "Dec 19 10:20:58", 
"username" : "customer2"} 

次の認証では、この特定のユーザーを検索し、新しい「開始」接続時間を挿入し、「停止」を消去する必要があります。等々。私に

{"connection" : [{ 
"start" : "Dec 19 10:21:48" 
"username" : "customer2"} 
  • 次の挑戦者、その新しい絞り込みリストを作成します。

これをしようとしましたが機能しません。

conn = [] 
for l in log: 
obcon = dict() 
if not obcon: 
    obcon['USER'] = l['USER'] 
    if l['DATA'] == 'connected': 
     obcon['START'] = l['DATA']  
     obcon['STOP'] = "" 
    else: 
     obcon['STOP'] = l['DATA'] 
conn.append(obcon) 

新しいリストを作成する前に、一部のユーザーが存在するかどうかを確認する必要があります。 ['接続']私は開始/停止接続を識別するために使用します:

Disconnected -> STOP 
Connected -> START 

もっと具体的にする必要があるかどうかわかりません。 アイデアが必要です。お願いします!

答えて

1

私の意見では、var logは、dictである必要があります。既存のユーザーデータをより簡単に見つけるのに役立ちます。
次にre(...).group(0)を使用しました。これはentire matching stringです。たとえば、ユーザ名を抽出するときには'<pppoe(.*?)>'と書かれていますが、group(1)(正規表現では、括弧は一致抽出に使用されます)にあります。

私の提案は、(注 - 彼らが使用されていないとして、私はsysosの輸入を削除)です。

import re 

f = open('log.log', 'r') 
log = dict() 
for line in f: 
    reg = re.search(r': ((?:dis)?connected)', line) # finds connected or disconnected 
    if reg is not None: 
     user = re.search(r'<pppoe-(.*?)>', line).group(1) 
     # if the user in the log, get it, else create it with empty dict 
     ob = log.setdefault(user, dict({'USER': user})) 
     ob['CONNECTION'] = reg.group(1) 
     time = re.search(r'^\w{3} \d{2} \d{2}:\d{2}:\d{2}', line).group(0) 
     if ob['CONNECTION'].startswith('dis'): 
      ob['END'] = time 
     else: 
      ob['START'] = time 
      if 'END' in ob: 
       ob.pop('END') 

ログファイルがある場合:

Dec 19 00:00:03 172.16.20.24 pppoe,ppp,info <pppoe-customer1>: terminating... - peer is not responding 
Dec 19 00:00:03 172.16.20.24 pppoe,ppp,info,account customer1 logged out, 4486 1009521 23444247 12573 18159 
Dec 19 00:00:03 172.16.20.24 pppoe,ppp,info <pppoe-customer1>: disconnected 
Dec 19 00:00:07 172.16.20.24 pppoe,info PPPoE connection established from 00:00:00:00:00:00 
Dec 19 00:00:08 172.16.20.24 pppoe,ppp,info,account customer2 logged in, 127.0.0.1 
Dec 19 00:00:08 172.16.20.24 pppoe,ppp,info <pppoe-customer2>: authenticated 
Dec 19 00:00:08 172.16.20.24 pppoe,ppp,info <pppoe-customer2>: connected 
Dec 19 00:00:13 172.16.20.24 pppoe,info PPPoE connection established from 00:00:00:00:00:00 
Dec 19 00:00:14 172.16.20.24 pppoe,ppp,error <ccfa>: user customer3 authentication failed 
Dec 19 00:02:03 172.16.20.24 pppoe,ppp,info,account customer2 logged out, 4486 1009521 23444247 12573 18159 
Dec 19 00:02:03 172.16.20.24 pppoe,ppp,info <pppoe-customer2>: disconnected 
Dec 19 00:02:08 172.16.20.24 pppoe,ppp,info,account customer3 logged in, 127.0.0.1 
Dec 19 00:02:08 172.16.20.24 pppoe,ppp,info <pppoe-customer3>: authenticated 
Dec 19 00:02:08 172.16.20.24 pppoe,ppp,info <pppoe-customer3>: connected 

logの値

{ 
    'customer1': { 
     'CONNECTION': 'disconnected', 
     'END': 'Dec 19 00:00:03', 
     'USER': 'customer1' 
    }, 
    'customer3': { 
     'START': 'Dec 19 00:02:08', 
     'CONNECTION': 'connected', 
     'USER': 'customer3' 
    }, 
    'customer2': { 
     'START': 'Dec 19 00:00:08', 
     'CONNECTION': 'disconnected', 
     'END': 'Dec 19 00:02:03', 
     'USER': 'customer2' 
    } 
} 
+0

これは素晴らしいです!しかし私は別の質問があります。私はそれに似た11のログを持っています、あなたはどう思いますか?私はそれを関数に入れ、それを各LOGに "インスタンス化"する必要がありますか?つまり、行がログに追加されるたびに、FORを再度実行しますか?あなたは分かったのですか、私は混乱していますか? – TMoraes

+0

@TMoraesうーん、私はあなたの必要性を正確に理解することができません。もう一度説明してください。 – DjLegolas

+0

質問を更新します。 – TMoraes

関連する問題