在Python中维护多个线程的日志文件

Maintaining log file from multiple threads in Python

我有我的python basehttpserver服务器,它处理POST请求。我使用了线程混合,它现在为每个连接打开一个线程。我希望执行几个多线程操作,例如:1。通过为每个计数器添加1来监视成功/失败的连接活动。我需要一把锁。我的计数器在同一文件的全局范围内。我该怎么做?2。我希望处理某种类型的队列并将其写入一个文件,其中队列的内容是一组字符串,这些字符串是从我的不同线程写入的,它们只发送一些日志记录问题的信息。怎么做?因为我的线程是"幕后"完成的,所以我没能做到这一点,因为每次我使用do-post(..)方法时,我已经处于不同的线程中了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Succcessful_Logins = 0
Failed_Logins = 0
LogsFile = open(logfile)

class httpHandler(BaseHTTPRequestHandler):

    def do_POST(self):
       ..

class ThreadingHTTPServer(ThreadingMixIn, HTTPServer):
    pass

server = ThreadingHTTPServer(('localhost', PORT_NUMBER), httpHandler)
server.serve_forever()

这是我的服务器的一个小部件。另一件困扰我的事情是,我想首先将后响应发送回客户机,然后可能由于锁定机制或其他原因而延迟。


从代码来看,似乎每个线程中都构造了一个新的httphandler?如果是这种情况,您可以使用一个类变量作为计数,使用一个互斥量来保护计数,如下所示:

1
2
3
4
5
6
7
8
9
10
class httpHandler(...):
    # Note that these are class variables and are therefore accessable
    # to all instances
    numSuccess = 0
    numSuccessLock = new threading.Lock()

    def do_POST(self):
        self.numSuccessLock.aquire()
        self.numSuccess += 1
        self.numSuccessLock.release()

对于从不同线程写入文件,有几个选项:

  • 使用日志模块,"日志模块旨在确保线程安全,而不需要客户机执行任何特殊工作。"来自http://docs.python.org/2/library/logging.html thread safety
  • 使用上面这样的锁对象来序列化对文件的写操作
  • 使用线程安全队列将写操作排队,然后从队列中读取并从单独的线程写入文件。示例请参见http://docs.python.org/2/library/queue.html模块队列。