nginx日志详解,nginx日志变量
Python项目的一个需求就是解析nginx的日志文件,这里给出详细的过程分析。
日志规则描述
首先明确一下你的Nginx的日志格式,这里采用的是默认的Nginx日志格式:
log _ format main $ remote _ addr-$ remote _ user[$ time _ local] $ request
$ status $ body _ bytes _ sent $ http _ referer
“$ http _ user _ agent”“$ http _ x _ forwarded _ for”;一个真实记录的例子如下:
下面的代码是3360。
172 . 22 . 8 . 207--[16/Dec/2014:17:57:35 0800] GET/report?domjjus 6 kew jp wculsqagdukaipodexmzawmdjdn 0 fc HTTP/1.1 200 0 - XXXXXXX/1 . 0 . 16;iPhone/iOS 8 . 1 . 2;8DA77E2F91D0
其中客户端型号信息替换为XXXXXXX。
Nginx日志文件已经根据项目中的业务规则进行了处理。命名规则如下:
ID-ID-YYMMDD-hhmmss
并且所有日志文件都存储在统一的路径中。
解决思路
获取所有日志文件path
这里,使用Python的glob模块来获取日志文件路径。
importglob
defreadfile(路径):
returnglob.glob(路径 *-*-*-* )获取日志文件中每一行的内容
使用Python的linecache模块获取文件行的内容。
importlinecache
defreadline(路径):
Returnlinecache.getlines(path)注意:linecache模块使用缓存,因此存在以下问题:
在使用linecache模块读取文件内容之后,如果文件发生了变化,那么就需要使用linecache.updatecache(filename)来更新缓存,以获取最新的变化。
linecache模块使用缓存,所以会消耗内存,消耗和要解析的文件有关。最好执行linecache.clearcache()在使用后清空缓存。
当然,作为一种优化,这里可以使用生成器进行优化。暂时按下no手表。
处理日志条目
一条日志信息是一个特定格式的字符串,所以用正则表达式解析,这里用到了Python的re模块。
下面,逐一建立规则:
规则
ip=r ?Pip[d.]*
日期=r ?更新d
月=r ?p月w
年份=r ?Pyeard
log_time=r ?PtimeS
method=r ?p方法S
request=r"?P<request>S+"
status=r"?P<status>d+"
bodyBytesSent=r"?P<bodybytessent>d+"
refer=r"""?P<refer>
[^"]*
"""
userAgent=r"""?P<useragent>
.*
"""
</useragent></refer></bodybytessent></status></request></method></time></year></month></date></ip>解析
代码如下:
p=re.compile(r"(%s)--\[(%s)/(%s)/(%s):(%s)[S]+]\"(%s)?[s]?(%s)?.*?"(%s)(%s)
这样,就可以得到日志条目中各个要素的原始数据。
格式及内容转化
得到日志原始数据之后,需要根据业务要求,对原始数据进行格式及内容转化。
这里需要处理的内容包括:时间,request,userAgent
时间格式转化
在日志信息原始数据中存在Dec这样的信息,利用Python的time模块可以方便的进行解析
importtime
解析request
在日志信息原始数据中得到的request的内容格式为:
/report?XXXXXX
这里只需要根据协议取出XXXXXX即可。
这里仍然采用Python的re模块
importre
接下来需要根据业务协议解析参数内容。这里需要先利用base64模块解码,然后再利用struct模块解构内容:
importstruct
解析userAgent
在日志信息原始数据中userAgent数据的格式为:
XXX; XXX; XXX; XXX
根据业务要求,只需要取出最后一项即可。
这里采用re模块来解析。
importre
至此,nginx日志文件解析基本完成。
剩下的工作就是根据业务需要,对获得的基本信息进行处理。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。