Python正则提取日志并写入文件的实现方法
本文介绍如何使用Python正则表达式从Apache日志文件中提取特定字段,并通过重定向sys.stdout将结果写入指定文件。通过示例代码展示了如何解析IP、时间、URL及状态码,并处理文件读写与输出恢复的逻辑。
正则过滤日志并输出到文件的实现
在处理服务器访问日志(如Apache的 access_test.log)时,通常需要提取关键信息并保存。以下示例演示了如何提取IP地址、访问时间、请求URL、状态码及流量数据,并将结果写入名为 20160205.txt 的文件中。
日志格式与提取逻辑
假设日志文件包含如下格式的数据:
27.19.74.143 - - [30/May/2015:17:38:21 +0800] "GET /static/image/smiley/default/sleepy.gif HTTP/1.1" 200 2375
8.35.201.164 - - [30/May/2015:17:38:21 +0800] "GET /static/image/common/pn.png HTTP/1.1" 200 592我们需要从每行中提取五个部分:IP、时间、URL、状态码和流量。通过正则表达式匹配这些字段,可以构建输出字符串。
核心代码实现
以下是完整的处理脚本。代码通过 sys.stdout 重定向技术,将 print 语句的输出直接写入文件,处理完毕后恢复标准输出。
#!/usr/bin/env python
# - coding:utf - 8 -*-
import re,sys
with open('access_test.log') as f:
for line in f:
parseip = re.search(r'(.*?) - - ', line)
parsetime = re.search(r'
(.*?)
(.*?)
', line)
parseurl = re.search(r' "\w+ (.*?) HTTP/', line)
parsestatus = re.search(r' HTTP/(.*?)" (.*?) ', line)
parseTraffic = re.search(r'\d+ \d+', line)
if parseip and parsetime and parseurl and parsestatus and parseTraffic is None:
continue
output=sys.stdout
outputfile=open('20160205.txt','a')
sys.stdout=outputfile
print parseip.group(1).split('?')[0] + '\t' + parsetime.group(1).split('?')[0] + '\t' + parseurl.group(1).split('?')[0] + '\t' + parsestatus.group(2) + '\t' + parseTraffic.group(0).split(' ')[1]
outputfile.close()
sys.stdout=output
import sys
关键步骤解析
- 设置输出文件:在写入前,保存当前的
sys.stdout到变量output,并打开目标文件(如20160205.txt)。 - 重定向输出:将
sys.stdout指向文件对象,使得后续的print语句内容写入文件而非控制台。 - 执行写入:使用
print输出拼接好的字符串,包含提取的IP、时间、URL、状态码和流量。 - 恢复与关闭:写入完成后,关闭文件对象,并将
sys.stdout恢复为原始值,确保后续程序正常运行。
若需将内容写入不同文件,可修改 open(filename, 'w') 中的 filename 参数。注意,写入模式 'w' 会覆盖原文件,而 'a' 会追加内容。
注意事项
- 正则表达式中的
.*?为非贪婪匹配,确保提取正确的字段。 - 处理日志时,需确保日志格式与正则表达式匹配,否则可能提取失败。
- 文件操作完成后,务必恢复
sys.stdout,避免影响其他输出。
以上就是Python中将正则过滤的内容输出写入到文件中的详细内容,更多关于Python日志处理与文件操作的技术资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













