设为首页 收藏本站
查看: 892|回复: 0

[经验分享] 分析nginx大日志文件,python多线程必备! .

[复制链接]

尚未签到

发表于 2018-11-12 06:23:47 | 显示全部楼层 |阅读模式
#!/usr/bin/python  
#coding:utf8
  
import threading     #载入多线程模块
  
import time          #载入时间模块
  
import os            #载入os模块
  
import shutil        #载入shutil模块
  
import re            #载入re正则模块
  
fuhao=os.linesep     #换行符
  
start_time=int(time.strftime('%H%M%S'))  #执行程序开始时间
  
print start_time
  
def count_cpu_heshu():                      #统计cpu核数函数
  
    file=open('/proc/cpuinfo')
  
    cpu_sum=[]
  
    for line in file.readlines():
  
        cpu_he=re.findall('^processor',line)
  
        if len(cpu_he)==1:
  
           cpu_sum.append(cpu_he)
  
        else:
  
           continue
  
    file.close()
  
    return len(cpu_sum)                    #返回cpu函数
  
def count_memory_size():                   #统计系统内存大小函数
  
    mem_sum=int(os.popen("free -m|awk  '{print $2}'|sed -n '2p'").readline().strip())  #统计内存的shell
  
    return mem_sum                                                                     #返回内存大小
  
def nginx_log_fenge():                    #因nginx日志太大,需要按500M分割,建立此函数进行分割日志
  
    if os.path.exists('/data/logs/nginx_tmp/')!=True:       #分割日志的临时目录
  
       os.makedirs('/data/logs/nginx_tmp/')
  
    if os.path.exists('/data/logs/nginx_tmp_binfa/')!=True: #并发目录
  
       os.makedirs('/data/logs/nginx_tmp_binfa/')
  
    if os.path.exists('/data/logs/nginx_tmp_txt01/')!=True:  #time记录txt目录
  
       os.makedirs('/data/logs/nginx_tmp_txt01/')
  
    if os.path.exists('/data/logs/nginx_tmp_txt02/')!=True:  #url记录txt目录
  
       os.makedirs('/data/logs/nginx_tmp_txt02/')
  
    if os.path.exists('/data/logs/nginx_tmp_chuli/')!=True:  #处理所有txt目录
  
       os.makedirs('/data/logs/nginx_tmp_chuli/')
  
    nginx_log_name=os.listdir('/data/logs/nginx_log')[0].strip()  #切割日志名
  
    nginx_file='/data/logs/nginx_log/%s' %nginx_log_name           #切割日志名及路径
  
    file=open(nginx_file)                   #nginx日志文件路径
  
    sizehint=int(count_memory_size() / count_cpu_heshu() * 0.5 * 1024 * 1024)              #此数字是按字节进行计算,这里大小为内存除以cpu核数剩以0.5得到的结果为500M
  
    position=0                               #当前位置为0
  
    file_num=1                               #分割文件名默认加1
  
    while True:                             #当条件为真执行,为假退出。
  
          lines = file.readlines(sizehint)   #读文件
  
          file_name='/data/logs/nginx_tmp/dd_access%d' %file_num  #分割成功的文件名
  
          file01=open(file_name,'w')       #写文件
  
          file01.writelines(lines)         #把读取的单个1G文件写到文件名中
  
          if  file.tell() - position > 0: #如果分割的位置大于默认位置就继续执行,否则就退出。
  
              position = file.tell()      #替换位置
  
              file_num=file_num+1
  
              continue
  
          else:
  
              break
  
    file.close()
  
    file01.close()
  
    os.remove(file_name)
  
    time.sleep(300)
  
def nginx_log_time_count(file_name01):         #nginx分析日志函数
  
    file_name='/data/logs/nginx_tmp_binfa/%s' %file_name01    #并发日志名
  
    file_txt='/data/logs/nginx_tmp_txt01/%s.txt' %file_name01        #执行shell结果保存目录
  
    cmd="awk '{print $4}' %s|awk -F / '{print $NF}'|awk -F : '{print $2$3$4$5}'  2>/dev/null|sort 2>/dev/null|uniq -c 2>/dev/null|sort -nr 2>/dev/null|head -n 1 > %s" %(file_name,file_txt)  #分析脚本
  
    os.system(cmd)  #执行shell命令
  
    fuhao_cmd='%s' %fuhao
  
    f=open(file_txt)
  
    f1=open('/data/logs/nginx_tmp_chuli/time_sum.txt','a')
  
    for line in f.readlines():
  
         time_single_max= line.split()[0]   #单个文件连接数
  
         f1.writelines(time_single_max)
  
         f1.write(fuhao_cmd)
  
    f.close()
  
    f1.close()
  
def nginx_log_url_count(file_name01):         #nginx分析日志函数
  
    file_name='/data/logs/nginx_tmp_binfa/%s' %file_name01  #并发日志名
  
    file_txt='/data/logs/nginx_tmp_txt02/%s.txt' %file_name01   #执行shell结果保存目录
  
    cmd="awk '{print $7}' %s  2>/dev/null|sort 2>/dev/null|uniq -c 2>/dev/null|sort -rn 2>/dev/null|head -n 200 > %s " %(file_name,file_txt)  #分析脚本
  
    os.system(cmd)  #执行shell命令
  
    fuhao_cmd='%s' %fuhao
  
    f=open(file_txt)
  
    f1=open('/data/logs/nginx_tmp_chuli/url_sum.txt','a')
  
    for line in f.readlines():          #把url_status里面每一行值以列表方法增加到url_count列表里面
  
        f1.writelines(line.strip())
  
        f1.write(fuhao_cmd)
  
    f.close()
  
    f1.close()
  
def dxc_call_time_count():                       #多线程调用分析日志函数
  
    file_name_read=[]                        #文件名读取列表
  
    f=os.listdir('/data/logs/nginx_tmp_binfa/')   #显示data/logs/nginx_tmp/目录下所有文件
  
    for read_filename in f:
  
        filename_chuancan=read_filename.strip()  #单个文件名
  
        filename=threading.Thread(target=nginx_log_time_count,args=(filename_chuancan,))  #建立多线程
  
        file_name_read.append(filename)         #添加线程到file_name_read列表
  
    filename_sum=range(len(file_name_read))     #统计文件名数量
  
    for line in filename_sum:
  
        file_name_read[line].start()            #启动线程
  
    for line in filename_sum:
  
        file_name_read[line].join()             #等待多线程结束后,就结束进程。
  
def dxc_call_url_count():                       #多线程调用分析日志函数
  
    file_name_read=[]                        #文件名读取列表
  
    f=os.listdir('/data/logs/nginx_tmp_binfa/')   #显示data/logs/nginx_tmp/目录下所有文件
  
    for read_filename in f:
  
        filename_chuancan=read_filename.strip()  #单个文件名
  
        filename=threading.Thread(target=nginx_log_url_count,args=(filename_chuancan,))  #建立多线程
  
        file_name_read.append(filename)         #添加线程到file_name_read列表
  
    filename_sum=range(len(file_name_read))     #统计文件名数量
  
    for line in filename_sum:
  
        file_name_read[line].start()            #启动线程
  
    for line in filename_sum:
  
        file_name_read[line].join()             #等待多线程结束后,就结束进程。
  
def time_count_chuli():                         #time处理函数
  
    f=open('/data/logs/nginx_tmp_chuli/time_sum.txt')
  
    time_max=[]
  
    for count in f:
  
       time_max.append(int(count.strip()))
  
    f.close()
  
    return max(time_max)
  
def url_count_chuli():                          #url处理函数
  
    f=open('/data/logs/nginx_tmp_chuli/url_sum.txt')
  
    url_max=[]
  
    for count in f:
  
        url_max.append(count.split())
  
    f.close()
  
    return url_max
  
def write_report_email():                       #写文件用来发email
  
    fuhao_cmd='%s' %fuhao
  
    time_max=time_count_chuli()                 #接受time处理函数返回的结果
  
    url_max=url_count_chuli()                   #接受url处理函数返回的结果
  
    file=open('/data/logs/nginx_log_email_tmp.txt','w')
  
    file.write("nginx单秒的最大请求数为:%d" %time_max)
  
    file.write(fuhao_cmd)
  
    file.write('nginx连接数TOP100排序')
  
    file.write(fuhao_cmd)
  
    new_dict={}                       #定义一字典用来统计连接重复数,得到字典结果为连接地址:连接重复数
  
    for i in url_max:                 #遍历url_max列表
  
         new_dict[i[1]] = new_dict.get(i[1],0) + int(i[0])    #i[1]表示连接地址,i[0]表示连接重复数,new_dict[i[1]]表示把列表中的地址重复数与地址连接交换,如果连接相同,就累加连接重复数.
  
    n_dict = {}                       #定义一字典用来恢复原来的连接重复数:连接地址
  
    for k in new_dict:                #遍历new_dict字典
  
         n_dict[new_dict[k]] = k      #k表示连接地址,new_dict[k]表示连接重复数,最后n_dict结果为连接重复数:连接地址
  
    url_count=sorted(n_dict.iteritems(),key=lambda dict1:dict1[0],reverse=True) #对字典进行排序
  
    for line in url_count:
  
        file.write('连接重复数:')
  
        file.write(str(line[0]))              #把连接重复数写到日志临时文件
  
        file.write('   ')
  
        file.write('http://d.m1905.com')      #写连接头文件
  
        file.write(str(line[1]))              #把连接地址写到日志临时文件
  
        file.write(fuhao_cmd)
  
    file.close()
  
    file=open('/data/logs/nginx_log_email_tmp.txt','r')   #读取日志临时文件
  
    row=0
  
    file01=open('/data/logs/nginx_log_email.txt','w')     #写文件
  
    for line in file.readlines():
  
        row=row+1                                         #row表示行数
  
        if row 0:   #动态统计分割日志文件个数
  
f=os.listdir('/data/logs/nginx_tmp/')          #动态统计分割日志文件
  
key=0                                                       #默认key为0
  
while (key

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-633809-1-1.html 上篇帖子: keepalived+nginx双网卡服务器双机热备 下篇帖子: Nginx如何实现读写限流的方法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表