Python TCP 服务器的日志记录

150 阅读2分钟

在使用 Python 编写 TCP 服务器时,我们需要对服务器的运行情况进行日志记录,以便能够在出现问题时快速定位和解决问题。然而,基本的 TCP 服务器代码中通常不包含日志记录功能,因此我们需要手动添加日志记录功能。

2. 解决方案

我们可以使用 Python 的 logging 模块来实现日志记录功能。logging 模块提供了一个简单而强大的日志记录框架,我们可以通过这个模块轻松地记录日志信息。

2.1 导入 logging 模块

首先,我们需要导入 logging 模块。

import logging

2.2 创建日志记录器

接下来,我们需要创建一个日志记录器。日志记录器是一个用来记录日志信息的组件,我们可以通过它来指定日志信息的格式和输出目的地。

logger = logging.getLogger('my_logger')

2.3 设置日志记录器的级别

日志记录器有不同的级别,分别为 DEBUGINFOWARNINGERRORCRITICAL。我们可以通过 setLevel() 方法来设置日志记录器的级别,只有高于该级别的日志信息才会被记录下来。

logger.setLevel(logging.INFO)

2.4 设置日志记录器的格式

我们可以通过 setFormatter() 方法来设置日志记录器的格式。日志记录器的格式决定了日志信息的输出方式。

formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger.setFormatter(formatter)

2.5 设置日志记录器的输出目的地

我们可以通过 addHandler() 方法来设置日志记录器的输出目的地。日志记录器的输出目的地可以是文件、控制台等。

handler = logging.FileHandler('my_log.txt')
logger.addHandler(handler)

2.6 记录日志信息

现在,我们可以使用 logger 对象来记录日志信息了。

logger.info('This is an info message')
logger.warning('This is a warning message')
logger.error('This is an error message')

2.7 代码例子

下面是一个完整的代码示例,展示了如何使用 logging 模块来为 Python TCP 服务器添加日志记录功能:

import socket
import sys
from thread import *
import logging

HOST = ''   # Symbolic name meaning all available interfaces
PORT = 8888

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print 'Socket created'

try:
    s.bind((HOST, PORT))
except socket.error , msg:
    print 'Bind failed. Error Code : ' + str(msg[0]) + ' Message ' + msg[1]
    sys.exit()

print 'Socket bind complete'

s.listen(10)
print 'Socket now listening'


logger = logging.getLogger('my_logger')
logger.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler = logging.FileHandler('my_log.txt')
handler.setFormatter(formatter)
logger.addHandler(handler)

#Function for handling connections
def clientthread(conn):
    #Sending message to connected client
    conn.send('Welcome to the server. Receving Data...\n') #send only takes string

    #infinite loop so that function do not terminate and thread do not end.
    while True:

        #Receiving from client
        data = conn.recv(1024)
        reply = 'Message Received at the server!\n'
        logger.info('Received data from client: %s', data)
        if not data:
            break

        conn.sendall(reply)

    conn.close()


#now keep talking with the client

while 1:
    #wait to accept a connection
    conn, addr = s.accept()
    print 'Connected with ' + addr[0] + ':' + str(addr[1])

    #start new thread
    start_new_thread(clientthread ,(conn,))

s.close()