gpt4 book ai didi

Python 实时获取任务请求对应的Nginx日志的方法

转载 作者:qq735679552 更新时间:2022-09-27 22:32:09 26 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章Python 实时获取任务请求对应的Nginx日志的方法由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

需求描述

项目需求测试过程中,需要向Nginx服务器发送一些用例请求,然后查看对应的Nginx日志,判断是否存在特征内容,来判断任务是否执行成功。为了提升效率,需要将这一过程实现自动化.

实践环境

Python 3.6.5 。

代码设计与实现 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#!/usr/bin/env python
# -*- coding:utf-8 -*-
 
 
'''
@CreateTime: 2021/06/26 9:05
@Author : shouke
'''
 
 
import time
import threading
import subprocess
from collections import deque
 
 
def collect_nginx_log():
     global nginx_log_queue
     global is_tasks_compete
     global task_status
 
 
     args = 'tail -0f /usr/local/openresty/nginx/logs/access.log'
     while task_status ! = 'req_log_got' :
         with subprocess.Popen(args, stdout = subprocess.PIPE, stderr = subprocess.PIPE, shell = True , universal_newlines = True ) as proc:
             log_for_req = ''
             outs, errs = ' ', ' '
 
             try :
                 outs, errs = proc.communicate(timeout = 2 )
             except subprocess.TimeoutExpired:
                 print ( '获取nginx日志超时,正在重试' )
                 proc.kill()
                 try :
                     outs, errs = proc.communicate(timeout = 5 )
                 except subprocess.TimeoutExpired:
                     print ( '获取nginx日志超时,再次超时,停止重试' )
                     break
             finally :
                 for line in outs.split( '\n' ):
                     flag = '\"client_ip\":\"10.118.0.77\"' # 特征
                     if flag in line: # 查找包含特征内容的日志
                         log_for_req + = line
 
                 if task_status = = 'req_finished' :
                     nginx_log_queue.append(log_for_req)
                     task_status = 'req_log_got'
 
 
 
def run_tasks(task_list):
     '''
     运行任务
     :param task_list 任务列表
     '''
 
     global nginx_log_queue
     global is_tasks_compete
     global task_status
 
 
     for task in task_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.1
         while task_status ! = 'req_log_got' : # 请求触发的nginx日志收集未完成
             time.sleep(time_to_wait)
             time_to_wait + = 0.01
         else : # 获取到用例请求触发的nginx日志
             if nginx_log_queue:
                 nginx_log = nginx_log_queue.popleft()
                 task_status = 'req_ready'
                 # 解析日志
                 # do something here
                 # ...
             else :
                 print ( '存储请求日志的队列为空' )
                 # do something here
                 # ...
 
 
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 = True
 
     current_active_thread_num = len (threading. enumerate ())
     while current_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日志内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。

原文链接:https://www.cnblogs.com/shouke/archive/2021/07/10/14993393.html 。

最后此篇关于Python 实时获取任务请求对应的Nginx日志的方法的文章就讲到这里了,如果你想了解更多关于Python 实时获取任务请求对应的Nginx日志的方法的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com