【使用场景】
有时候一些分布式服务器上的问题,日志获取是需要两段联动,比如:客户端出现了报错,这时候要去服务器上看服务器的原因,手工开启日志等等。人为在服务器等待守护不现实,比较好的方法就是写一个可以通信的脚本,客户端发现了报错,通知服务端,服务端侧进行日志收集
客户端代码
主要逻辑:
循环执行某一个命令,如果出现成功,则发消息给服务端,cmdstr写客户端需要捕获的日志的命令
# -*- coding: utf-8 -*-
# Created: huashan
import httplib
import os
import commands
import time
cmdstr = "cat xx.log|tail -n 10 |grep xxx"
connectPort = 8000
def SendProblemOccurMeesage():
conn = httplib.HTTPConnection("127.0.0.1:" + str(connectPort))
conn.request('GET', '/')
print conn.getresponse().read()
conn.close()
while True:
status,output=commands.getstatusoutput(cmdstr)
if int(status) == 0:
print "problem occur, send message to server"
SendProblemOccurMeesage()
time.sleep(5)
服务端代码:
主要逻辑
启动监听,收到客户端消息后,执行cmdstr上面配置的命令,可以是dump信息,可以是打印堆栈,可以是日志开启并收集等等
# -*- coding: utf-8 -*-
# Created: huashan
import os #Python的标准库中的os模块包含普遍的操作系统功能
import re #引入正则表达式对象
import urllib #用于对URL进行编解码
from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler #导入HTTP处理相关的模块
import commands
cmdstr = "server -dump xxxx"
listenPort = 8000
#自定义处理程序,用于处理HTTP请求
class TestHTTPHandler(BaseHTTPRequestHandler):
#处理GET请求
def do_GET(self):
#获取URL
print 'URL=',self.path
#页面输出模板字符串
templateStr = '''<html><body>receive</body></html>'''
self.protocal_version = 'HTTP/1.1' #设置协议版本
self.send_response(200) #设置响应状态码
self.send_header("Welcome", "Contect") #设置响应头
self.end_headers()
self.wfile.write(templateStr) #输出响应内容
status,output=commands.getstatusoutput(cmdstr)
#启动服务函数
def start_server(port):
http_server = HTTPServer(('', int(port)), TestHTTPHandler)
http_server.serve_forever() #设置一直监听并接收请求
start_server(listenPort) #启动服务,监听8000端口