Python怎么实时获取任务请求对应的Nginx日志
Python怎么实时获取任务请求对应的Nginx日志
这篇文章主要讲解了“Python怎么实时获取任务请求对应的Nginx日志”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python怎么实时获取任务请求对应的Nginx日志”吧!
需求描述
项目需求测试过程中,需要向Nginx服务器发送一些用例请求,然后查看对应的Nginx日志,判断是否存在特征内容,来判断任务是否执行成功。为了提升效率,需要将这一过程实现自动化。
实践环境
Python 3.6.5
代码设计与实现
#!/usr/bin/envpython#-*-coding:utf-8-*-"""@CreateTime:2021/06/269:05@Author:shouke"""importtimeimportthreadingimportsubprocessfromcollectionsimportdequedefcollect_nginx_log():globalnginx_log_queueglobalis_tasks_competeglobaltask_statusargs="tail-0f/usr/local/openresty/nginx/logs/access.log"whiletask_status!="req_log_got":withsubprocess.Popen(args,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True,universal_newlines=True)asproc:log_for_req=""outs,errs="",""try:outs,errs=proc.communicate(timeout=2)exceptsubprocess.TimeoutExpired:print("获取nginx日志超时,正在重试")proc.kill()try:outs,errs=proc.communicate(timeout=5)exceptsubprocess.TimeoutExpired:print("获取nginx日志超时,再次超时,停止重试")breakfinally:forlineinouts.split(""):flag=""client_ip":"10.118.0.77""#特征ifflaginline:#查找包含特征内容的日志log_for_req+=lineiftask_status=="req_finished":nginx_log_queue.append(log_for_req)task_status="req_log_got"defrun_tasks(task_list):"""运行任务:paramtask_list任务列表"""globalnginx_log_queueglobalis_tasks_competeglobaltask_statusfortaskintask_list:thread=threading.Thread(target=collect_nginx_log,name="collect_nginx_log")thread.start()time.sleep(1)#执行任务前,让收集日志线程先做好准备print("正在执行任务:%s"%task.get("name"))#执行Nginx任务请求#...task_status="req_finished"time_to_wait=0.1whiletask_status!="req_log_got":#请求触发的nginx日志收集未完成time.sleep(time_to_wait)time_to_wait+=0.01else:#获取到用例请求触发的nginx日志ifnginx_log_queue:nginx_log=nginx_log_queue.popleft()task_status="req_ready"#解析日志#dosomethinghere#...else:print("存储请求日志的队列为空")#dosomethinghere#...if__name__=="__main__":nginx_log_queue=deque()is_tasks_compete=False#所有任务是否执行完成task_status="req_ready"#req_ready,req_finished,req_log_got#存放执行次任务任务的一些状态print("###########################任务开始###########################")tast_list=[{"name":"test_task","other":"..."}]run_tasks(tast_list)is_tasks_compete=Truecurrent_active_thread_num=len(threading.enumerate())whilecurrent_active_thread_num!=1:time.sleep(2)current_active_thread_num=len(threading.enumerate())print("###########################任务完成###########################")
注意:
1、上述代码为啥不一步到位,直接tail -0f /usr/local/openresty/nginx/logs/access.log | grep "特征内容"
呢?这是因为这样做无法获取到Nginx的日志
2、实践时发现,第一次执行proc.communicate(timeout=2)
获取日志时,总是无法获取,会超时,需要二次获取,并且timeout
设置太小时(实践时尝试过设置为1秒
),也会导致第二次执行时无法获取Nginx日志。
感谢各位的阅读,以上就是“Python怎么实时获取任务请求对应的Nginx日志”的内容了,经过本文的学习后,相信大家对Python怎么实时获取任务请求对应的Nginx日志这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是恰卡编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!
推荐阅读
-
python(中无效的十进制怎么解决 python怎么转换进制)
python怎么转换进制?Python执行二进制转换:1.十进制到二进制(bin)首先,让让我们看看如何将十进制转换成二进制。我...
-
python怎么清除完全相同的行(python splte如何分隔有多个相同符号的str)
pythonsplte如何分隔有多个相同符号的str?str你的string内容str_(相同的符号)执行完了以后再在相同符号的...
-
python(编程控制电脑关机 如何控制电脑关机)
如何控制电脑关机?可以在电脑的运行窗口中输入输入公式,给电脑可以设置自动关机。1.按开快捷键winr然后打开运行窗口。2.在运行窗...
-
python中的特殊标识符(python 中 标识符中可以有逗号吗)
python中标识符中可以有逗号吗?在python语言中合法的标识符是字母、数字以及_,所以我合法的标识符中肯定不能有逗号if...
-
python(excel 提取数据写入新表 python导入excel数据找不到工作簿)
python导入excel数据找不到工作簿?我可以导入数据后找不到工作,不是因为他的工作没有被转移。什么软件可提取并合并Exce...
-
python中字典定义的四种方法(python global关键字的用法详解)
pythonglobal关键字的用法详解?global标志实际上是目的是提示python讲解器,说被其修饰的变量是全局变量。这样...
-
python(array用法 python如何对两个数组做差处理)
python如何对两个数组做差处理?Python中的列表中的元素肯定不能真接相加,减。t最佳的位置的是将列表装换成Python中的...
-
python多行注释符号怎么表示
python多行注释符号怎么表示这篇文章主要介绍“python多行...
-
python支持的操作系统是什么
python支持的操作系统是什么这篇文章主要介绍“python支持...
-
python如何判断列表为空
python如何判断列表为空这篇文章主要介绍“python如何判断...