公司的研发查看生产环境的日志,考虑安全问题,每次都要我们运维人员去拿日志发给研发人员,这样会浪费我们运维人员很多的时间,我就想能不能通过web端给研发人员自己去看日志。通过百度我发现python的paramiko库可以远程查看服务器的文件,我就想用paramiko+flask的方式写一个查看日志的小工具。以下是源码
首先我们用paramiko模块去尝试去获取服务端的日志信息
#获取服务端日志信息
import paramiko
import os
import codecs
import yaml
#Linux端
#with open('/app/application/log_find/host/hosts.yaml', 'r') as f:
# host = yaml.load(f, Loader=yaml.FullLoader)
#Windows端
with open('E:/my_python/log_find_cornupay/host/hosts.yaml', 'r') as f:
host = yaml.load(f, Loader=yaml.FullLoader)
try:
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(host['host_233']['hostname'], host['host_233']['port'], host['host_233']['username'], host['host_233']['password'], compress=True, timeout=65536)
sftp_client = client.open_sftp()
except EOFError:
client.connect(host['host_233']['hostname'], host['host_233']['port'], host['host_233']['username'], host['host_233']['password'], compress=True, timeout=65536)
sftp_client = client.open_sftp()
class Get_log():
def __init__(self,url):
self.url = url
def get_log(self):
log = sftp_client.open(self.url,'rb')
log_list = []
for line in log:
line = line.decode('GBK')
log_list.append(line)
log.close()
return ''.join(log_list)
这里我把账户密码写到hosts.yaml文件里了,然后把获取日志封装为一个class类了,后面在调用class写上文件路径会方便很多,用列表来显示日志信息是因为想要在web界面一行一行显示,因为日志里面有中文,所有用decode()函数来转换为GBK编码,不然会有乱码的情况。调用一下class查看是否能获取到文件内容
获取文件没问题了,接下来我们用flask的Web框架把获取到的内容显示到Web端
#us_lanpay_kernel蓝图
from flask import Blueprint, render_template
from host import host_233
us_lanpay_kernel = Blueprint('us_lanpay_kernel', __name__)
@us_lanpay_kernel.route('/us_lanpay_kernel_nohup')
def us_lanpay_kernel_nohup():
us_lanpay_kernel_nohup_log = host_233.Get_log('/opt/weblogic/user_projects/domains/CN_LANPAY_KERNEL/test.txt')
return render_template('Conupay/us_lanpay_kernel/us_lanpay_kernel_nohup.html', us_lanpay_kernel_nohup_log=us_lanpay_kernel_nohup_log.get_log())
这里用蓝图把获取到的内容渲染到前端的html上,由于我不会前端,找的是一个开源的框架随便改了改用的,大致思路就是这样,以下是效果图