如何将日志记录添加到带有时间戳的文件到Raspberry Pi的Python TCP服务器

use*_*228 8 python logging tcpserver raspberry-pi

我有点被困在我的项目中,我迫切需要帮助.我需要一个简单的TCP服务器python代码,它具有日志和时间戳等功能,我可以用于我的Raspberry Pi.它是我的最后一年项目.

我看了一些例子,但由于我在编写自己的脚本/代码方面没有太多经验,所以我不太清楚如何去做.如果有人可以通过解释和一些例子(如果可能的话)指导我正确的方向,我将不胜感激.

我正在使用HERCULES SETUP UTILITY,它充当我的TCP客户端,而我的visual studio python代码充当SERVER.我的SERVER可以接收客户端发送的数据,我现在似乎无法添加一个日志文件,可以将发送的数据保存到文本文件中.有人请给我一些例子或者说明一下吗?你的帮助意味着很多.到目前为止这是我的代码:

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 ))
Run Code Online (Sandbox Code Playgroud)

jfs*_*jfs 30

要将日志记录添加到带有时间戳的文件,您可以使用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")
Run Code Online (Sandbox Code Playgroud)

如果你运行代码; 你应该看到myserver.log(+/-你的时区和当前时间):

2013-12-24 09:20:17,739 some message
Run Code Online (Sandbox Code Playgroud)

这是一个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()
Run Code Online (Sandbox Code Playgroud)

如果代码保存在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
Run Code Online (Sandbox Code Playgroud)

要运行客户端:

$ echo abc | nc localhost 8826
Sent by Client: abc
Run Code Online (Sandbox Code Playgroud)