如何为树莓派上的Python TCP服务器添加带有时间戳的日志记录到文件中

9

我在我的项目中遇到了困境,急需帮助。我需要一个简单的TCP服务器Python代码,其中包括日志记录和时间戳等功能,以便我在树莓派上使用。这是我的毕业设计。

我看过一些例子,但由于我没有写自己的脚本/代码的经验,我不太确定应该如何做。如果有人能够为我提供正确的方向指导,并且最好能提供一些示例,我将不胜感激。

我正在使用HERCULES SETUP UTILITY,它充当我的TCP客户端,而我的Visual Studio Python代码充当服务器。我的服务器现在可以接收客户端发送的数据,但我似乎无法添加保存发送数据的日志文件。请问是否可以给我一些示例或参考资料?您的帮助将意味着很多。这是我目前的代码:

from socket import *
import thread

BUFF = 1024 # buffer size
HOST = '172.16.166.206'# IP address of host
PORT = 1234 # Port number for client & server to recieve data
def response(key):
    return 'Sent by client'

def handler(clientsock,addr):
    while 1:
        data = clientsock.recv(BUFF) # receive data(buffer).
        print 'data:' + repr(data)   #Server to recieve data sent by client.
        if not data: break           #If connection is closed by client, server will        break and stop recieving data.
        print 'sent:' + repr(response('')) # respond by saying "Sent By Client". 



if __name__=='__main__':
    ADDR = (HOST, PORT) #Define Addr
    serversock = socket(AF_INET, SOCK_STREAM) 
    serversock.bind(ADDR) #Binds the ServerSocket to a specific address (IP address and     port number)
    serversock.listen(0)
    while 1:
        print 'waiting for connection...'
        clientsock, addr = serversock.accept()
        print '...connected from:', addr #show its connected to which addr
        thread.start_new_thread(handler, (clientsock, addr ))

请提供有关服务器功能的更多详细信息。顺便说一下,您可以参考asyncore库。 - elprup
服务器应该使用哪种协议?(例如,http、telnet、SMTP?)您提到了“日志记录和时间戳”等功能。还有哪些类似于日志记录和时间戳的功能?它们在哪些方面相似?您是否有一份描述功能集的任务清单? - Robᵩ
不要直接使用“thread”模块,它太底层了。请改用“threading”模块。 - jfs
1个回答

31

要在文件中添加带有时间戳的日志记录,您可以使用 logging 模块:

import logging

logging.basicConfig(level=logging.INFO, 
                    filename='myserver.log', # log to this file
                    format='%(asctime)s %(message)s') # include timestamp
logging.info("some message")

如果你运行这段代码,你应该在myserver.log文件中看到(加上/减去你所在的时区和当前时间):

2013-12-24 09:20:17,739 some message

这是一个完整的TCP服务器示例,它会在每次从客户端接收到的行前加上“Sent by Client:”短语并将其发送回去:
#!/usr/bin/env python
import logging
import sys
from SocketServer import ThreadingTCPServer, StreamRequestHandler

info = logging.getLogger(__name__).info

class EchoLineHandler(StreamRequestHandler):
    def handle(self):
        info("handling request from %s", self.client_address)
        # prepend each line (b'\n') and send it back
        for line in self.rfile:
            self.wfile.write(b"Sent by Client: ") # assume ascii-based encoding
            self.wfile.write(line)
        info("done %s", self.client_address)

def test(ServerClass=ThreadingTCPServer, HandlerClass=EchoLineHandler):
    # configure logging
    logging.basicConfig(level=logging.INFO,
                        filename='server.log', # log to this file
                        format='%(asctime)s %(message)s') # include timestamp

    # parse command line arguments
    host, port = 'localhost', 8826
    if len(sys.argv) > 1:
        host_, separator, port_ = sys.argv[1].rpartition(":")
        port = int(port_)
        if separator: # if ":" in sys.argv[1]
            host = host_ # accept any host, including empty

    # listen for connections
    server = ServerClass((host, port), HandlerClass)
    info("Serving on %s port %s", *server.server_address)
    try:
        server.serve_forever()
    finally:
        info("quit.")

if __name__=="__main__":
    test()

如果代码保存在echo_line_server.py中,运行服务器的方法如下:

$ python -mecho_line_server localhost:8826 & tail -F server.log
2013-12-24 17:09:38,089 Serving on 127.0.0.1 port 8826

运行客户端:
$ echo abc | nc localhost 8826
Sent by Client: abc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接