[菜鸡求教] Python中如何优雅地远程查看程序输出的日志?

现在是定期从服务器把 log 信息下载下来查看 感觉有点蠢
不知道有没有可以实时远程查看 log 信息的工具
或者可以把 log 信息输出到某个端口 方便 web 查看

菜鸡勿喷
[菜鸡求教] Python中如何优雅地远程查看程序输出的日志?

14 回复

阿里云有个日志分析服务,是实时推送的,不过他的可视化界面有点惨,那个查询语句门槛有点高


核心方案:用 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()

怎么用:

  1. 在接收日志的机器上运行 python log_server.py
  2. 在你的程序机器上运行 python your_app.py(记得把 localhost 改成接收机器的真实IP)
  3. 在接收机器的控制台就能看到实时日志了

进阶方案:

  • 如果不想自己写服务端,可以用现成的方案:
    • ELK Stack:Elasticsearch + Logstash + Kibana,企业级方案
    • Fluentd:轻量级的日志收集器
    • Sentry:专门用于错误日志监控
    • Graylog:开源的日志管理平台

一句话总结:用 logging 模块的 SocketHandler 把日志发到网络,再写个服务端接收。

写到 es,kibana 查看

elk 了解下

tail -f logfile

统一 2 楼 很方便

ssh <hostname> tail -f <log_path>

我干过最蠢的事,远程提交 JSON 表单到服务器,表单里包含 log,log 在网站目录里保存成单个文件,其他信息进数据库,并保存路径,然后可以直接在浏览器打开 log 文件。

filebeat 读取日志,推送到 logstash 上,然后用 elasticsearch 进行收集,用 kibana 进行可视化,相当好的效果

tail
vim
cat

下载下来
日志采集

websocket 服务端实现 tail -f

Splunk 了解一下,Free license 足够用

less 快捷键 F (shift + f)

回到顶部