Nagios チェックを実行する Python スクリプトを作成しました。スクリプトの機能は非常に単純で、ログを解析し、nagios チェック出力を作成するために使用される情報を照合するだけです。ログは snmptrapd ログ ウィッチで、他のサーバーからのトラップを記録/var/log/snmptrapd
し、スクリプトで解析した後にログに記録します。最新のトラップを取得するために、ログを読むたびに Python からログを消去します。情報を保存するために、nagios のチェック間隔よりも少し短い時間間隔で、ログの内容を別のログにコピーする cron ジョブを作成しました。私が理解していないのは、なぜログがそれほど大きくなっているのかということです (つまり、1000 倍の情報を持つメッセージ ログの方が小さいと思います)。ログで見たものから、次のような特殊文字がたくさんあります^@
これは、pytonからファイルを操作する方法で行われていると思いますが、3週間ほどの経験があるので、問題を理解できないようです。
スクリプト コードは次のとおりです。
import sys, os, re
validstring = "OK"
filename = "/var/log/snmptrapd.log"
if os.stat(filename)[6] == 0:
print validstring
sys.exit()
else:
f = open(filename,"r")
sharestring = ""
line1 = []
patte0 = re.compile("[0-9]+-[0-9]+-[0-9]+")
patte2 = re.compile("NG: [a-zA-Z\s=0-9]+.*")
for line in f:
line1 = line.split(" ")
if re.search(patte0,line1[0]):
sharestring = sharestring + line1[1] + " "
continue
result2 = re.search(patte2,line)
if result2:
result22 = result2.group()
result22 = result22.replace("NG:","")
sharestring = sharestring + result22 + " "
f.close()
f1 = open(filename,"w")
f1.close()
print sharestring
sys.exit(2)
〜
ログは次のようになります。
2012-07-11 04:17:16 Some IP(via UDP: [this is an ip]:port) TRAP, SNMP v1, community somestring
SNMPv2-SMI::enterprises.OID Some info which is not necesarry
SNMPv2-MIB::sysDescrOID = STRING: info which i'm matching
ファイルを消去する私の方法と関係があると確信していますが、それを理解することはできません。何かアイデアがあれば、私は本当に興味があります。ありがとうございました。
サイズに関する情報として、私は 93 行あり (Vim と言う)、ログは 161K を占めますが、行が非常に短いため、これは問題ありません。
OK、ファイルを読んで消去した方法とは関係ありません。ログファイルを消去しているときにこれを行っているsnmptrapdデーモンの何かです。コードを変更し、ファイルを開く前に SIGSTOP を snmptrapd に送信し、ファイルに変更を加え、完了後に SIGCONT を送信しましたが、同じ動作が発生しているようです。新しいコードは次のようになります (異なる部分):
else:
command = "pidof snmptrapd"
p=subprocess.Popen(shlex.split(command),stdout=subprocess.PIPE)
pidstring = p.stdout.readline()
patte1 = re.compile("[0-9]+")
pidnr = re.search(patte1,pidstring)
pid = pidnr.group()
os.kill(int(pid), SIGSTOP)
time.sleep(0.5)
f = open(filename,"r+")
sharestring = ""
と
sharestring = sharestring + result22 + " "
f.truncate(0)
f.close()
time.sleep(0.5)
os.kill(int(pid), SIGCONT)
print sharestring
デーモンがファイルを消去するのを停止し、その後、適切な権限でファイルを再作成してデーモンを開始することを考えています。