前言
本文主要是将日志文件字段截取出来进行日志分析,主要用到了一些模块,正则表达式,以及对文件的一些操作。
一、目标
把日志文件scwebsite2_ssl.log里的ip,时间字段获取出来,时间格式转化为“2021-11-24 12:00:00", 通过ip解析出它属于哪个省份和运营商,结果写入另一个文件
二、代码实现
import re
import requests
import json
def read_file(input_file_name,output_file_name): # 取IP函数:将输入文件中的IP地址输出到指定文件中
_fLog = open(input_file_name)# 打开目标文件
ip_list=[]
for each in _fLog:
ip=re.findall(r'(?<![\.\d])(?:\d{1,3}\.){3}\d{1,3}(?![\.\d])', str(each), re.S) # 正则查找ip地址
ip_list.append(ip[0])
ids = list(set(ip_list)) # 列表去重:通过set方法进行处理
print("共解析ip个数:%s "% len(ids))
# ##写出数据到本地
# 设置输出文件路径
out = open(output_file_name, "a") # 打开要存放截取的IP的文件
for each in ids:
print(each)
out.write(each + '\n')
out.close() # 关闭连接
_fLog.close()
print("ip提取完毕!")
def URL(url_ip): # 函数功能:去除url后面的IP地址
url_ip = url_ip[::-1]
d4 = url_ip.index('=')
url_ip = url_ip[::-1]
url_ip = url_ip[0:len(url_ip) - d4]
return url_ip
read_file("scwebsite2_ssl.log","outout.log")
f = open("outout.log") # 打开ip地址文件
_fp = open("message.txt","a") # 以追加写的形式打开文件,以便写入处理后的数据
for i in f: # 遍历ip地址
url = "http://ip.aliyun.com/outGetIpInfo?accessKey=alibaba-inc&ip=114.119.156.146"
url = URL(url) + i # 使用URL函数将url末尾的IP地址去除,将ip文件中的ip地址接到url后面
try:
response = requests.get(url) # request获取url回复
url_text = response.text
dict_message = json.loads(url_text) # 利用json模块将字典形式的字符串转化成字典放入dict_message中
print(dict_message)
ip = dict_message.get('data').get('queryIp') # 获取字典中key为queryIp的值,即IP地址
country = dict_message.get('data').get('country') # 获取字典中key为country的值,即国家名称
region = dict_message.get('data').get('region') # 获取字典中key为region的值,即省份名称
isp = dict_message.get('data').get('isp') # 获取字典中key为isp的值,即服务商名称
message = ip + ':' + country + ' ' + region + ' ' + isp + '\n' # 将获取的值组合在一起
print(message)
_fp.write(message) # 将每一条信息追加到文件中
except:
print("请求错误的url:")
print(url)
三、用到的模块
1.re模块
re.findall()可以配合正则表达式,将文件中所需要的信息过滤出来。 findall(pattern, string, flags = 0 ) ip=re.findall(r’(?<![.\d])(?:\d{1,3}.){3}\d{1,3}(?![.\d])’, str(each), re.S) # 正则查找ip地址 findall的r‘’里面接的是要查找内容的正则表达式,string位置则是要查找的所有内容,flag位置为标识位。 re.findall()返回的是列表也就是数组。
2.requests模块
requests.get()的作用是通过url对服务器发起请求的。 requests.get()在请求服务器失败之后会报错,会导致程序中断,如果对与部分不能请求的url想要跳过它继续请求后面的url的话,可以使用try…except…来跳过错误,继续执行下面的代码。
3.json模块
json.loads()的作用是将字符串形式的json数据转换成字典形式。如:向服务器发送请求后,服务端返回了,js数据,我们可以利用json.load()将字典形式的字符串数据转换成字典。 利用json.loads()转换成字典。
|