Python读取远程服务器日志最后一行报文件不存在如何解决
问题根因
- 代码中虽然导入了Fabric的
Connection类,但从未实际发起远程SSH连接,直接调用本地内置的open()函数只能读取本地文件系统资源,完全无法访问远程服务器上的文件。 - 填写的路径
\\\\Server\xyz.log是Windows SMB网络共享的路径写法,既不符合SSH远程访问的路径规则,且字符串中\x属于Python转义字符前缀,会被解析为特殊字符,本地系统检索不到对应路径自然抛出No such file or directory报错。 - 逐行遍历全量文件取最后一行的逻辑在日志体积较大时,会占用不必要的IO和内存资源,执行效率极低。
正确实现方案
优先选择在远程端直接执行命令取结果的方式,不需要传输整个日志文件,性能最优,适配GB级大日志场景:
from fabric import Connection # 替换为实际的服务器连接信息与日志路径 REMOTE_ADDR = "远程服务器IP/域名" REMOTE_USER = "SSH登录用户名" # 密钥登录可替换为connect_kwargs={"key_filename": "本地私钥文件路径"} CONNECT_CONF = {"connect_kwargs": {"password": "SSH登录密码"}} REMOTE_LOG_ABS_PATH = "/var/log/your_service/xyz.log" # 远程服务器上日志的绝对路径,Linux以/开头,Windows服务器填如C:/logs/xyz.log格式 with Connection(host=REMOTE_ADDR, user=REMOTE_USER, **CONNECT_CONF) as conn: # 远程执行tail命令直接取最后一行,结果直接返回本地 exec_result = conn.run(f"tail -n 1 {REMOTE_LOG_ABS_PATH}", hide=True) last_line = exec_result.stdout.strip() print(last_line)
如果需要通过SFTP协议读取远程文件内容做后续处理,可使用Fabric内置的SFTP客户端实现,注意不要用本地open()方法:
from fabric import Connection REMOTE_ADDR = "远程服务器IP/域名" REMOTE_USER = "SSH登录用户名" CONNECT_CONF = {"connect_kwargs": {"password": "SSH登录密码"}} REMOTE_LOG_ABS_PATH = "/var/log/your_service/xyz.log" with Connection(host=REMOTE_ADDR, user=REMOTE_USER, **CONNECT_CONF) as conn: # 通过SFTP打开远程文件 with conn.sftp().open(REMOTE_LOG_ABS_PATH, "r") as f: last_line = "" for line in f: last_line = line.strip() print(last_line)
注意事项
- 远程文件路径必须填写服务器上的绝对路径,不要使用Windows共享路径的
\\Server\格式。 - 生产环境建议使用SSH密钥登录,不要在代码中明文写登录密码。
- 如果远程服务器是Windows系统,需要提前在服务器端开启OpenSSH服务,Fabric才能正常连接。
内容的提问来源于stack exchange,提问作者Anonymous
相关产品推荐
相关产品推荐

