需要从服务器实时读取Apache日志文件,如果发现某些字符串,则必须发送电子邮件。我已经采用了here找到的代码来读取日志文件。接下来如何发送此电子邮件。我是否必须发出睡眠命令?请指教。
注意:由于这是实时的,发送电子邮件后python程序必须再次开始读取日志文件。这个过程还在继续。
import time
import os
#open the file
filename = '/var/log/apache2/access.log'
file = open(filename,'r')
while 1:
where = file.tell()
line = file.readline()
if not line:
time.sleep(1)
file.seek(where)
else:
if 'MyTerm' in line:
print line
答案 0 :(得分:4)
好吧,如果您想要实时而不是停留在发送邮件,您可以启动一个单独的线程来发送电子邮件。以下是在python中使用线程的方法(线程和线程):
http://www.tutorialspoint.com/python/python_multithreading.htm
接下来,您可以使用 smtplib 轻松地在python中发送电子邮件。这是来自同一网站的另一个例子(我使用它并且非常好):
http://www.tutorialspoint.com/python/python_sending_email.htm
嗯,你需要这样做,以尽可能加快日志阅读线程,并确保它不会等待邮寄。
现在你需要处理一些陷阱:
启动太多线程时一定要小心。例如,您每隔1秒解析(暂时只是假设)日志,但发送电子邮件需要10秒。很容易看到(这是一个夸张的例子,当然)你将启动许多线程,你将填补可用的资源。我不知道你期望的字符串会每秒弹出多少次,但这是你必须考虑的情况。
再次根据工作负载,您可以实现流式算法并完全避免使用电子邮件。我不知道它是否适用于你的情况,但我也想提醒你这个场景。
您可以创建一个队列并在其中放入一定数量的邮件并将它们一起发送,从而避免一次发送多封邮件(同样假设您不需要为每次发送一次邮件都触发警报你有目标字符串)。
<强>更新强>
如果您真的想要创建完美的程序,则可以在修改日志文件时使用事件触发来执行其他操作。这样,您将完全避免睡眠,并且每次向文件添加某些内容时,都会调用python并且您可以解析新内容并在需要时发送电子邮件。看看看门狗:
http://pythonhosted.org/watchdog/
并且: python pyinotify to monitor the specified suffix files in a dir