Mongodb 慢查询日志分析 - 1

Mongodb 慢查询日志分析

使用 mloginfo 处理过的日志会在控制台输出, 显示还是比较友好的.

但是如果内容较大, 就不方便查看了, 如果可以导入到 excel 就比较方便筛选/排序. 但是 mloginfo 并没有提供生成到 excel 的功能. 可以通过一个 python 脚本辅助生成:

py 复制代码
import pandas as pd
import re

# 定义文件路径
mloginfo_output_file = "mloginfo_output.txt"  # 假设已经保存了 mloginfo 的输出内容
excel_output_file = "mloginfo_slow_queries.xlsx"

# 定义解析逻辑
def parse_mloginfo(file_path):
    parsed_data = []
    with open(file_path, "r", encoding="utf-8") as f:
        for line in f:
            # 跳过表头或空行
            if line.startswith("namespace") or not line.strip():
                continue
            # 用正则表达式解析每一行
            match = re.match(
                r'^(?P<namespace>\S+)\s+(?P<operation>\S+)\s+(?P<pattern>\{.*?\}|None)\s+(?P<count>\d+)\s+(?P<min_ms>\d+)\s+(?P<max_ms>\d+)\s+(?P<percentile_95>\d+\.?\d*)\s+(?P<sum_ms>\d+)\s+(?P<mean_ms>\d+\.?\d*)\s+(?P<allowDiskUse>\S+)',
                line
            )
            if match:
                parsed_data.append(match.groupdict())
    return parsed_data

# 调用解析逻辑
parsed_data = parse_mloginfo(mloginfo_output_file)

# 如果有数据,转换为 DataFrame 并保存为 Excel
if parsed_data:
    df = pd.DataFrame(parsed_data)
    # 转换数据类型(如数字列)
    numeric_columns = ["count", "min_ms", "max_ms", "percentile_95", "sum_ms", "mean_ms"]
    for col in numeric_columns:
        df[col] = pd.to_numeric(df[col])
    # 保存为 Excel 文件
    df.to_excel(excel_output_file, index=False)
    print(f"慢查询已成功保存到 {excel_output_file}")
else:
    print("未找到可解析的慢查询数据。")

以下是一个更加完成的, 可以在命令参数中执行日志文件:

py 复制代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import re
import pandas as pd
import argparse

# 设置命令行参数解析
parser = argparse.ArgumentParser(description="解析 mloginfo 输出并保存为 Excel")
parser.add_argument("log_file", type=str, help="mloginfo 输出文件路径")
args = parser.parse_args()

# Step 1: 运行 mloginfo 命令,捕获输出
log_file = args.log_file

output_file = f"{log_file}.txt"

excel_output_file = f"{log_file}.xlsx"

os.system(f"mloginfo {log_file} --queries > {output_file}")


# 定义解析逻辑
def parse_mloginfo(file_path):
    parsed_data = []
    with open(file_path, "r", encoding="utf-8") as f:
        for line in f:
            # 跳过表头或空行
            if line.startswith("namespace") or not line.strip():
                continue
            # 用正则表达式解析每一行
            match = re.match(
                    r'^(?P<namespace>\S+)\s+(?P<operation>\S+)\s+(?P<pattern>\{.*?\}|None)\s+(?P<count>\d+)\s+(?P<min_ms>\d+)\s+(?P<max_ms>\d+)\s+(?P<percentile_95>\d+\.?\d*)\s+(?P<sum_ms>\d+)\s+(?P<mean_ms>\d+\.?\d*)\s+(?P<allowDiskUse>\S+)',
                    line)
            if match:
                parsed_data.append(match.groupdict())
    return parsed_data


# 调用解析逻辑
parsed_data = parse_mloginfo(output_file)

# 如果有数据,转换为 DataFrame 并保存为 Excel
if parsed_data:
    df = pd.DataFrame(parsed_data)
    # 转换数据类型(如数字列)
    numeric_columns = [
        "count", "min_ms", "max_ms", "percentile_95", "sum_ms", "mean_ms"
    ]
    for col in numeric_columns:
        df[col] = pd.to_numeric(df[col])

    # 调整列顺序,将 pattern 列移到最后
    columns = [col for col in df.columns if col != "pattern"] + ["pattern"]
    df = df[columns]

    # 保存为 Excel 文件
    df.to_excel(excel_output_file, index=False)
    print(f"慢查询已成功保存到 {excel_output_file}")
else:
    print("未找到可解析的慢查询数据。")
相关推荐
查理零世20 分钟前
【算法】经典博弈论问题——巴什博弈 python
开发语言·python·算法
时光书签36 分钟前
Mongodb副本集群为什么选择3个节点不选择4个节点
数据库·mongodb·nosql
汤姆和佩琦1 小时前
2025-1-21-sklearn学习(43) 使用 scikit-learn 介绍机器学习 楼上阑干横斗柄,寒露人远鸡相应。
人工智能·python·学习·机器学习·scikit-learn·sklearn
HyperAI超神经1 小时前
【TVM教程】为 ARM CPU 自动调优卷积网络
arm开发·人工智能·python·深度学习·机器学习·tvm·编译器
缺的不是资料,是学习的心2 小时前
使用qwen作为基座训练分类大模型
python·机器学习·分类
人才程序员2 小时前
【C++拓展】vs2022使用SQlite3
c语言·开发语言·数据库·c++·qt·ui·sqlite
极客先躯2 小时前
高级java每日一道面试题-2025年01月23日-数据库篇-主键与索引有什么区别 ?
java·数据库·java高级·高级面试题·选择合适的主键·谨慎创建索引·定期评估索引的有效性
指尖下的技术2 小时前
Mysql面试题----MyISAM和InnoDB的区别
数据库·mysql
Zda天天爱打卡3 小时前
【机器学习实战中阶】使用Python和OpenCV进行手语识别
人工智能·python·深度学习·opencv·机器学习
永远是我的最爱3 小时前
数据库SQLite和SCADA DIAView应用教程
数据库·sqlite