我制作了一个执行 nagios 检查的 python 脚本。脚本的功能非常简单,它只是解析日志并匹配一些用于构建 nagios 检查输出的信息。该日志是一个 snmptrapd 日志,它记录来自其他服务器的陷阱,并在/var/log/snmptrapd
我只用脚本解析它们之后将它们记录下来。为了获得最新的陷阱,我每次阅读后都会从 python 中删除日志。为了保留信息,我做了一个 cron 作业,它以比 nagios 检查间隔小一点的时间间隔将日志内容复制到另一个日志中。我不明白的是为什么日志增长如此之多(我的意思是消息日志,我猜它有 1000 倍的信息更小)。从我在日志中看到的有很多特殊字符,例如^@
我认为这是通过我从 pyton 操作文件的方式完成的,但看到我有三周的经验,我似乎无法找出问题所在。
脚本代码如下:
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,这不好,因为行很短。
好的,这与我读取和擦除文件的方式无关。当我擦除它的日志文件时,snmptrapd 守护进程中的某些东西正在执行此操作。我已经修改了我的代码,现在我在打开文件之前将 SIGSTOP 发送到 snmptrapd reight,我对文件进行了修改,然后在完成后发送 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
我正在考虑停止守护进程擦除文件,然后使用适当的权限重新创建它并启动守护进程。