1

需要从服务器实时读取 Apache 日志文件,如果找到某个字符串,则必须发送电子邮件。我已采用此处找到的代码来读取日志文件。接下来如何发送这封电子邮件。我必须发出睡眠命令吗?请指教。

注意:由于这是实时的,在发送电子邮件后,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
4

1 回答 1

4

好吧,如果您希望它是实时的并且不被困在发送邮件上,您可以启动一个单独的线程来发送电子邮件。以下是在 python 中使用线程的方法(线程线程):

http://www.tutorialspoint.com/python/python_multithreading.htm

接下来,您可以使用smtplib在 python 中轻松发送电子邮件。这是来自同一网站的另一个示例(我使用它并且非常好):

http://www.tutorialspoint.com/python/python_sending_email.htm

好吧,您需要这样做以尽可能加快日志读取线程并确保它不会等待邮寄。

现在你必须注意一些陷阱:

  1. 您必须小心启动太多线程。例如,您每 1 秒解析一次(让我们暂时假设)日志,但发送一封电子邮件需要 10 秒。很容易看出(当然,这是一个夸张的例子)您将启动许多线程并填充可用资源。我不知道您期望的字符串每秒会弹出多少次,但这是您必须考虑的情况。

  2. 再次根据工作负载,您可以实现流式算法并完全避免电子邮件。我不知道它是否适用于你的情况,但我也更愿意提醒你这种情况。

  3. 您可以创建一个队列并将一定数量的消息放入其中并将它们一起发送,从而避免一次发送许多邮件(再次假设您不需要为每次出现的目标字符串触发警报)。

更新

如果您真的想创建完美的程序,您可以在修改日志文件时使用事件触发来做其他事情。这样,您将完全避免睡眠,并且每次将某些内容添加到文件中时,都会调用 python,您可以解析新内容并在需要时发送电子邮件。看一下看门狗:

http://pythonhosted.org/watchdog/

这: python pyinotify 监视目录中的指定后缀文件

https://github.com/seb-m/pyinotify

于 2013-11-06T07:38:31.687 回答