在使用 Python 编写 TCP 服务器时,我们需要对服务器的运行情况进行日志记录,以便能够在出现问题时快速定位和解决问题。然而,基本的 TCP 服务器代码中通常不包含日志记录功能,因此我们需要手动添加日志记录功能。
2. 解决方案
我们可以使用 Python 的 logging 模块来实现日志记录功能。logging 模块提供了一个简单而强大的日志记录框架,我们可以通过这个模块轻松地记录日志信息。
2.1 导入 logging 模块
首先,我们需要导入 logging 模块。
import logging
2.2 创建日志记录器
接下来,我们需要创建一个日志记录器。日志记录器是一个用来记录日志信息的组件,我们可以通过它来指定日志信息的格式和输出目的地。
logger = logging.getLogger('my_logger')
2.3 设置日志记录器的级别
日志记录器有不同的级别,分别为 DEBUG、INFO、WARNING、ERROR 和 CRITICAL。我们可以通过 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()