2017-02-12 3 views
0

グッドモーニング、パイソン - いくつかのロジックを持つログファイルをループ

私はもっぱら学習のpythonの目的のために、小規模なプロジェクトにとっています。 これまでのところ、スクリプトは別のサーバにsshして、ダウンしているノードのリストを取得します。私はこれを変更して、ダウンしているノードのリストをtmpファイルに格納し、翌日にはもう一方を比較し、昨日ダウンしていないノードでしか動作しないようにしたい。しかし、その部分は待つことができます...

私は現在、いくつかのログファイルでさまざまな文字列を検索していますが、特定のノードの行数が一定数を超えている場合は、端末に送信されるのではなく、メッセージが送信されます。「ログエントリが多すぎます」というエントリが/ tmp/..に保存されます。

ここまでは私が今まで持っていることはありますが、あなたは私のスクリプトのために、他のアドバイスを持っている場合。

また、私は無限に感謝するでしょう。私が学んでいますが、それはゆっくりと沈んだ!:)

#!/usr/bin/python 
# 

from subprocess import * 
import sys 
from glob import glob 
import argparse 

parser = argparse.ArgumentParser() 
parser.add_argument('-f', metavar='logname', help='logfile to check') 
args = parser.parse_args() 

ssh = Popen(["ssh", "[email protected]", 'check_nodes'], 
      shell=False, 
      stdout=PIPE, 
      stderr=PIPE) 
result = ssh.stdout.readlines() 

down_nodes=[] 
status_list=["down", "admindown"] 

if result == []: 
    error = ssh.stderr.readlines() 
    print >>sys.stderr, "ERROR: %s" % error 

else: 
     for line in result[1:]: 
      columns = line.split() 
      status = columns[3] 
      nodes = columns[2] 
      if status in status_list: 
       down_nodes.append(nodes) 

if args.f: 
    logs = args.f 
else: 
    try: 
     logs = glob("/var/log/*") 
    except IndexError: 
     print "Something is wrong. Logs not available." 
     sys.exit(1) 

valid_errors = ["error", "MCE", "CATERR"] 

for log in logs: 
    with open("log", "r") as tmp_log: 
     opn_log = tmp_log.readlines() 

for line in open_log: 
    for down_nodes in open_log: 
     if valid_errors in open_log: 
      print valid_errors 

一種の私がこれまで持っています、テストでは動作しますが、エラーはvalid_errorsで見つかるだけで、down_nodevalid_errorsが同じになる行は見つかりません時間。また、日付とおそらく何かのような、down_nodevalid_errorsを含むログの行には、3日以上の日付文字列が含まれています。

金曜日から - 私は何にもPythonを使用していませんでした。私はシェルスクリプトだけで働いていて、必要なものに完璧なbashスクリプトを見つけました。だから私は初心者です... :)

おかげ は、それが明確になる場合、私は私の具体的な質問を分解してきたジョン・

+0

ファイルの行の上に行くループは、ファイルの上に行く1内にネストされなければなりません。また、valid_errorsはリストであり、間違った構文を使用して行にエントリがあるかどうかを確認しています。そのためにsubstrを使用することができます。行は使用されず、open_logのスペルは間違っています。ファイル内のエントリを1つ見つけて小さなものから始め、そこから移動します。 – postoronnim

+0

お世話になりました。スペルミスは、ここにコピー/ペーストしたり、いくつかのsrvの名前を変更したり、変数の名前などを変更したときに何かを変更したためです。substrを見て、それを理解できるかどうかを確認します。私は、 'valid_errors'と' down_node'の中の何らかのエラーと日付を含む行を見つける必要があります。だから私はずっとそれを演奏する必要があります。 – jonnybinthemix

+0

はい、一度に多くの新しいことに取り組んできたようです。小さな部分でそれを分解し、それらの部分に取り組んでください。それが助けられたならば、自由にアップアップしてください。 – postoronnim

答えて

0

...基本的には現時点で、私はラインを見つけようとしていますdown_nodesvalid_errors私のコードのいずれかのいずれかを含むログファイルの束に:

for node in down_nodes: 
    for log in logs: 
     with open(log) as log1: 
      open_log = log1.readlines() 
       for line in open_log: 
        if node + valid_errors in line 
         print line 
+0

非常に多くのネストされた条件文やループなどを持っているので本当に乱雑に思えるので、私は正しい線に沿って考えていないことを願っています。 – jonnybinthemix

+0

誰でも???? :(.. – jonnybinthemix

関連する問題