python 中日志异步发送到远程服务器( 二 )


class CustomHandler(logging.Handler):    def __init__(self, host, uri, method="POST"):        logging.Handler.__init__(self)        self.url = "%s/%s" % (host, uri)        method = method.upper()        if method not in ["GET", "POST"]:            raise ValueError("method must be GET or POST")        self.method = method    def emit(self, record):        '''        :param record:        :return:        '''        msg = self.format(record)        if self.method == "GET":            if (self.url.find("?") >= 0):                sep = '&'            else:                sep = '?'            url = self.url + "%c%s" % (sep, urllib.parse.urlencode({"log": msg}))            requests.get(url, timeout=1)        else:            headers = {                "Content-type": "Application/x-www-form-urlencoded",                "Content-length": str(len(msg))            }            requests.post(self.url, data=https://www.isolves.com/it/cxkf/yy/Python/2020-09-25/{'log': msg}, headers=headers, timeout=1)上面代码中有一行定义发送的参数 msg = self.format(record)
这行代码表示,将会根据日志对象设置的格式返回对应的内容. 之后再将内容通过requests库进行发送,无论使用get 还是post方式,服务端都可以正常的接收到日志 [2020-09-23 11:43:50] [DEBUG] 今天天气不错
三、异步的发送远程日志现在我们考虑一个问题,当日志发送到远程服务器过程中,如果远程服务器处理的很慢,会耗费一定的时间,那么这时记录日志就会都变慢
修改服务器日志处理类,让其停顿5秒钟,模拟长时间的处理流程
async def post(self):    print(self.getParam('log'))    await asyncio.sleep(5)    self.write({"msg": 'ok'})此时我们再打印上面的日志
logger.debug("今天天气不错")logger.debug("是风和日丽的")得到的输出为
[2020-09-23 11:47:33] [DEBUG] 今天天气不错[2020-09-23 11:47:38] [DEBUG] 是风和日丽的我们注意到,它们的时间间隔也是5秒 。
那么现在问题来了 , 原本只是一个记录日志 , 现在却成了拖累整个脚本的累赘 , 所以我们需要异步的来处理远程写日志 。
3.1 使用多线程处理首先想的是应该是用多线程来执行发送日志方法
def emit(self, record):    msg = self.format(record)    if self.method == "GET":        if (self.url.find("?") >= 0):            sep = '&'        else:            sep = '?'        url = self.url + "%c%s" % (sep, urllib.parse.urlencode({"log": msg}))        t = threading.Thread(target=requests.get, args=(url,))        t.start()    else:        headers = {            "Content-type": "application/x-www-form-urlencoded",            "Content-length": str(len(msg))        }        t = threading.Thread(target=requests.post, args=(self.url,), kwargs={"data":{'log': msg}, "headers":headers})        t.start()


推荐阅读