Python 解析日志文件之收集行数据

  • Post category:Python

收集行数据是指在日志文件中找到某些特定的行,然后提取其中的数据并进行分析。在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()函数输出总查询数和总查询时间。