mysql 与nginx打包工具_贴一段 nginx日志对应放入mysql的python工具

#!/usr/bin/python

# -*- coding: utf-8 -*-

"""

用于切分 nginx日志

nginx日志 格式:

log_format  access  '$remote_addr - $remote_user [$time_local] "$request" '

'$status $body_bytes_sent "$http_referer" '

'"$http_user_agent" $http_x_forwarded_for';

INSERT INTO `nginxlog` (`status`, `remote_user`, `http_referer`, `remote_addr`, `http_x_forwarded_for`, `hostname`, `request`, `request_type`, `http_user_agent`, `time_local`) VALUES ('2', '2', '2', '2', '2', '2', '2', '2', '2', '2')

table sql:

CREATE TABLE `nginxlog` (

`status` int(4) DEFAULT NULL,

`remote_user` varchar(20) DEFAULT NULL,

`http_referer` text,

`remote_addr` varchar(20) DEFAULT NULL,

`http_x_forwarded_for` varchar(20) DEFAULT NULL,

`hostname` varchar(50) DEFAULT NULL,

`request` varchar(200) DEFAULT NULL,

`request_type` varchar(10) DEFAULT NULL,

`http_user_agent` varchar(200) DEFAULT NULL,

`time_local` int(10) unsigned DEFAULT NULL,

`server_id` int(5) unsigned DEFAULT NULL

) ENGINE=MyISAM DEFAULT CHARSET=utf8

"""

#--------------------------config----------------------------------------------------------------------

#config

mysql = {}

mysql['mhost'] = 'localhost'

mysql['muser'] = 'root'

mysql['mpwd'] = ''

mysql['mport'] = '3306'

mysql['mdbname'] = 'nginxlog'

#获取当前执行目录  工作目录

ROOT = '/home/nginxweblog/app/'

#ftp 目录  用于存放生产 原始 日志

Sourcedatadir = '/home/nginxweblog/sourcedata/'

#log run

Logfile = ROOT+'nginxlog.log'

#--------------------------------import--------------------------------------------------------

import re,time,os

import MySQLdb

#--------------------------------Sublog--------------------------------------------------------

#分析 每行的 nginxlog 数据

class Sublog:

def __init__(self, logline=None):

if logline:

self.logline = logline.strip()

self.logdate = {}

#self.run()

def run(self):

if self.logline:

self.splitlog()

self.getlog()

def splitlog(self):

# 按照空格切分日志

self.splitlogd = re.split(' ', self.logline)

#print self.splitlogd

return self.splitlogd

def getlog(self):

if len(self.splitlogd) >= 20:

self.logdate['remote_addr'] = self.splitlogd[0]

self.logdate['remote_user'] = self.splitlogd[2]

self.logdate['time_local'] = time.mktime(time.strptime(self.splitlogd[3], '[%d/%b/%Y:%H:%M:%S'))

self.logdate['request_type'] = self.splitlogd[5].replace('\"', '')

self.logdate['request'] = self.splitlogd[6]

self.logdate['status'] = self.splitlogd[8]

self.logdate['http_referer'] = MySQLdb.escape_string(self.splitlogd[10].replace('\"', ''))

self.logdate['http_x_forwarded_for'] = self.splitlogd[len(self.splitlogd)-1]

self.get_http_user_agent()

self.get_hostname()

def get_http_user_agent(self):

agent = re.compile(r'\"(.*?)\"')

self.logdate['http_user_agent'] = MySQLdb.escape_string(agent.findall(self.logline)[2])

def get_hostname(self):

hostname_r = re.compile(r'http://(.*?)/')

ishostname = hostname_r.findall(self.splitlogd[10])

#print ishostname

if len(ishostname) >= 1:

self.logdate['hostname'] = ishostname[0]

else:

self.logdate['hostname'] = '-'

#--------------------------------insert_log---------------------------------------------

#   生成 csv 数据  |||  分割 数据  , 主要用于 mysql快速导入

class insert_log(Sublog):

def __init__(self, logpath, serverid):

Sublog.__init__(self)

self.nowtime = time.strftime("%Y_%m_%d",time.localtime(time.time()))

self.sunlogfile = "nginxlog_"+self.nowtime+'.csv'

self.logpath = logpath

self.serverid = serverid

self.numbres = 0

#self.Mysql_db_instance = Mysql_db()

def createsubfile(self):

self.opencsvfile()

self.subfile = open(ROOT+'CSV/'+self.sunlogfile, 'a')

olog = open(self.logpath)

for i in olog:

#self.logdate = {}

self.logline = i.strip()

self.run()

if self.logdate:

#print self.logdate

self.createsql()

#self.insertdb()

#time.sleep(3)

self.numbres = self.numbres + 1

self.subfile.close()

return [ROOT+'CSV/'+self.sunlogfile, self.sunlogfile, self.numbres]

def insertdb(self):

sql = "INSERT INTO `nginxlog` (`status`, `remote_user`, `http_referer`, `remote_addr`, `http_x_forwarded_for`, `hostname`, `request`, `request_type`, `http_user_agent`, `time_local`) VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s');" % (self.logdate['status'], self.logdate['remote_user'], self.logdate['http_referer'], self.logdate['remote_addr'], self.logdate['http_x_forwarded_for'], self.logdate['hostname'], self.logdate['request'], self.logdate['request_type'], self.logdate['http_user_agent'], self.logdate['time_local'])

#print sql

self.subfile.write(sql + '\n')

#self.Mysql_db_instance.insertsql(sql)

#self.Mysql_db_instance.commit()

def createsql(self):

c = "%s|||%s|||%s|||%s|||%s|||%s|||%s|||%s|||%s|||%s|||%s" % (self.logdate['status'], self.logdate['remote_user'], self.logdate['http_referer'], self.logdate['remote_addr'], self.logdate['http_x_forwarded_for'], self.logdate['hostname'], self.logdate['request'], self.logdate['request_type'], self.logdate['http_user_agent'], self.logdate['time_local'],self.serverid)

self.subfile.write(c + '\n')

def opencsvfile(self):

if os.path.isdir(ROOT+'CSV'):

pass

else:

os.mkdir(ROOT+'CSV')

#--------------------------------function ---------------------------------------------

def load_mysql(csvfile):

if mysql['mpwd']:

os.system("""mysql -h%s -u%s -p%s -e  "LOAD DATA INFILE '%s' INTO TABLE nginxlog.nginxlog FIELDS TERMINATED BY '|||';" && rm -rf %s """ % (mysql['mhost'], mysql['muser'], mysql['mpwd'], csvfile, csvfile))

else:

os.system("""mysql -h%s -u%s -e  "LOAD DATA INFILE '%s' INTO TABLE nginxlog.nginxlog FIELDS TERMINATED BY '|||';" && rm -rf %s """ % (mysql['mhost'], mysql['muser'], csvfile, csvfile))

#索引处理 type = 0  删除索引, 1创建索引

def mysqlindex(type):

if mysql['mpwd']:

ism = "mysql -h%s -u%s -p%s -e " % (mysql['mhost'], mysql['muser'], mysql['mpwd'])

else:

ism = "mysql -h%s -u%s -e  " % (mysql['mhost'], mysql['muser'])

if type == 0:

os.system(" %s 'alter table nginxlog.nginxlog drop index time_local' " % ism)

os.system(" %s 'alter table nginxlog.nginxlog drop index hostname' " % ism)

os.system(" %s 'alter table nginxlog.nginxlog drop index remote_addr' " % ism)

elif type == 1:

os.system(" %s 'alter table nginxlog.nginxlog add index time_local(time_local)' " % ism)

os.system(" %s 'alter table nginxlog.nginxlog add index hostname(hostname)' " % ism)

os.system(" %s 'alter table nginxlog.nginxlog add index remote_addr(remote_addr)' " % ism)

""" 日志记录函数 """

def write_logs(logconten):

logfile_path = Logfile

if logfile_path and logconten:

log_write = open(logfile_path, 'a')

log_write.write(logconten+'\n')

log_write.close()

#

#--------------------------------运行---------------------------------------------

def run():

list = os.listdir(Sourcedatadir)

print 'start.......'

write_logs('-----------%s start.....----%s-----------------' % ( time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(time.time())), str(list)) )

for line in list:

if os.path.isfile(Sourcedatadir+line):

s = re.split('_', line)

if re.match(r'^\d.*$', s[0]):

write_logs('time(%s) logfile(%s) start ....' % (time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(time.time())), line))

insert_log_instance = insert_log(Sourcedatadir+line, s[0])

gfiledata = insert_log_instance.createsubfile()

load_mysql(gfiledata[0])

os.remove(Sourcedatadir+line)

write_logs('time(%s) logfile(%s) log numbers(%s) stop ....' % (time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(time.time())), line, str(gfiledata[2])) )

print Sourcedatadir+line+ ' OK ....... '

#--------------------------------  exece ---------------------------------------------

if __name__ == "__main__":

#run_inotify(Sourcedatadir, run)

run()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值