收集行数据是指在日志文件中找到某些特定的行,然后提取其中的数据并进行分析。在Python中,我们可以使用正则表达式来解析日志文件并提取所需的数据。
下面是一个完整的Python解析日志文件之收集行数据的攻略:
1. 导入必要的库
import re
2. 打开日志文件
with open('logfile.txt', 'r') as f:
logdata = f.read()
3. 解析日志
pattern = r'some pattern' # 用正则表达式匹配特定行
matches = re.findall(pattern, logdata)
for match in matches:
# 处理每一条匹配成功的行
其中,pattern
应为一个正则表达式,用于匹配特定行。例如,假设我们要匹配以‘2019’年开头的行:
pattern = r'^2019.*'
在这个例子中,^
表示字符串开头,2019
表示匹配以‘2019’开头的行,.*
表示匹配任意字符(除了换行符)0次或多次。
示例1:收集HTTP请求的状态码
假设我们有一个HTTP请求的日志文件,其格式如下:
[2021-01-01 12:00:00] GET /path/to/resource HTTP/1.1 200 OK
[2021-01-01 12:00:01] POST /path/to/resource HTTP/1.1 404 Not Found
[2021-01-01 12:00:02] GET /path/to/resource HTTP/1.1 200 OK
[2021-01-01 12:00:03] GET /path/to/resource HTTP/1.1 500 Internal Server Error
我们希望从中收集HTTP请求的状态码,即‘200’、‘404’、‘500’等信息。可以使用如下的代码:
with open('http_log.txt', 'r') as f:
logdata = f.read()
pattern = r'\[(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})\] [A-Z]{3,4} ([a-zA-Z0-9_/.-]+) HTTP/\d.\d (\d{3})'
matches = re.findall(pattern, logdata)
for match in matches:
print(match[2])
在上述代码中,正则表达式pattern
用于匹配日志行,提取其中的日期/时间、请求的URL、状态码(通过小括号分组的方式)。最后,在循环中打印出每个匹配成功的状态码。
示例2:收集SQL查询次数和执行时间
假设我们有一个包含SQL查询的日志文件,其格式如下:
[2021-01-01 12:00:00] INFO: Executing SQL: SELECT * FROM users;
[2021-01-01 12:00:01] INFO: Executing SQL: SELECT * FROM products;
[2021-01-01 12:00:02] INFO: Query took 2.5 seconds to execute
[2021-01-01 12:00:03] INFO: Executing SQL: SELECT * FROM orders;
[2021-01-01 12:00:04] INFO: Query took 1.2 seconds to execute
我们希望从中收集SQL查询的次数和执行时间,即‘3’和‘3.7’秒。可以使用如下的代码:
with open('sql_log.txt', 'r') as f:
logdata = f.read()
pattern = r'INFO: Executing SQL:'
query_count = len(re.findall(pattern, logdata))
pattern = r'INFO: Query took (\d+\.\d+) seconds to execute'
matches = re.findall(pattern, logdata)
query_time = sum(float(match) for match in matches)
print(f'Total queries: {query_count}')
print(f'Total query time: {query_time} seconds')
在上述代码中,第一个正则表达式pattern
用于匹配SQL查询的行数。第二个正则表达式用于匹配查询时间,(\d+\.\d+)
部分表示匹配一个小数,sum()
函数用于将所有小数加起来。最后,使用print()
函数输出总查询数和总查询时间。