核心方案:用 logging 模块配合 logging.handlers.SocketHandler 把日志发到网络,再用一个服务端接收展示。
别在代码里到处写 print 了,那玩意儿出问题还得上服务器看。用 logging 模块,它能让你把日志发到网络、文件、控制台等地方,非常灵活。
下面给你个完整例子,分客户端(你的程序)和服务端(收日志的机器)两部分。
1. 客户端代码 (your_app.py)
import logging
import logging.handlers
import time
def setup_logger():
# 创建 logger
logger = logging.getLogger('my_app')
logger.setLevel(logging.DEBUG) # 设置最低日志级别
# 创建 SocketHandler,指向接收日志的机器IP和端口
socket_handler = logging.handlers.SocketHandler('localhost', 9020) # 改成接收机器的IP
socket_handler.setLevel(logging.DEBUG)
# 设置日志格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
socket_handler.setFormatter(formatter)
# 添加 handler 到 logger
logger.addHandler(socket_handler)
return logger
def main():
logger = setup_logger()
# 模拟程序运行,产生日志
for i in range(10):
logger.debug(f'调试信息: 循环第 {i} 次')
logger.info(f'普通信息: 处理了一些数据')
logger.warning(f'警告: 资源使用较高')
time.sleep(1)
logger.error('错误: 发生了某个问题')
if __name__ == '__main__':
main()
2. 服务端代码 (log_server.py)
import logging
import logging.handlers
import socketserver
import struct
import pickle
class LogRecordStreamHandler(socketserver.StreamRequestHandler):
"""处理从客户端发来的日志记录"""
def handle(self):
while True:
chunk = self.connection.recv(4)
if len(chunk) < 4:
break
slen = struct.unpack('>L', chunk)[0]
chunk = self.connection.recv(slen)
while len(chunk) < slen:
chunk = chunk + self.connection.recv(slen - len(chunk))
obj = pickle.loads(chunk)
record = logging.makeLogRecord(obj)
self.handle_log_record(record)
def handle_log_record(self, record):
# 这里可以自定义如何处理接收到的日志
# 示例:打印到控制台
print(f"[{record.levelname}] {record.name}: {record.getMessage()}")
def start_log_server(host='0.0.0.0', port=9020):
"""启动日志接收服务器"""
print(f"日志服务器启动在 {host}:{port},等待连接...")
server = socketserver.TCPServer((host, port), LogRecordStreamHandler)
server.serve_forever()
if __name__ == '__main__':
start_log_server()
怎么用:
- 在接收日志的机器上运行
python log_server.py
- 在你的程序机器上运行
python your_app.py(记得把 localhost 改成接收机器的真实IP)
- 在接收机器的控制台就能看到实时日志了
进阶方案:
- 如果不想自己写服务端,可以用现成的方案:
- ELK Stack:Elasticsearch + Logstash + Kibana,企业级方案
- Fluentd:轻量级的日志收集器
- Sentry:专门用于错误日志监控
- Graylog:开源的日志管理平台
一句话总结:用 logging 模块的 SocketHandler 把日志发到网络,再写个服务端接收。