Python 在Windows上监控Linux日志
import paramiko
import time
def monitor_linux_log(linux_ip, username, password, log_file):
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(linux_ip, username=username, password=password)
while True:
stdin, stdout, stderr = client.exec_command(f"tail -f {log_file}")
for line in stdout:
print(line.strip())
time.sleep(1) # 等待1秒再次读取日志文件
# 调用函数开始监控日志文件
monitor_linux_log('192.168.10.x', '0', '0', '/var/log/messages')
因为tail -f命令执行之后,会一直停在那儿等待新的日志。当知道具体日志,可以匹配日志,然后停止ssh通道,停止脚本运行,Demo如下
from concurrent.futures import ThreadPoolExecutor
import re
import paramiko
import time
linux_ip = ''
username = ''
password = ''
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(linux_ip, username=username, password=password)
flag2 = False
def monitor_linux_log():
stdin, stdout, stderr = client.exec_command(f"tail -f /var/log/messages")
while True:
for line in stdout:
print(line.strip())
if re.search('Destroying ProtocolHandler \[\"http-nio-[0-9]{3,5}\"\]', line.strip()):
global flag2
flag2 = True
print(f"11{flag2}")
client.close()
break
break
def kill_ssh_client():
print(2)
n = 0
while True:
if not flag2 and n < 30:
print(f"22{flag2}")
time.sleep(1)
n += 1
elif flag2 or n >= 30:
print(f"33{flag2}")
client.close()
break
def run():
with ThreadPoolExecutor() as executor:
# 提交任务到线程池,并获取Future对象
future1 = executor.submit(monitor_linux_log)
future2 = executor.submit(kill_ssh_client)
if __name__ == '__main__':
# 调用函数开始监控日志文件
run()

浙公网安备 33010602011771号