1. 程式人生 > 資料庫 >詳解grep獲取MySQL錯誤日誌資訊的方法

詳解grep獲取MySQL錯誤日誌資訊的方法

為方便維護MySQL,寫了個指令碼用以提供收集錯誤資訊的介面。這些錯誤資訊來自與MySQL錯誤日誌,而 通過grep mysql可以獲取error-log的路徑。

以下是全部相關程式碼:

#!/usr/bin/env python2.7
#-*- encoding: utf-8 -*-
 
"""
該模組用於提取每天mysql日誌中的異常或錯誤資訊
author: xiaomo
email: [email protected]
"""
 
import os
import sys
import string
from datetime import *
 
# 預設字元解碼器為utf-8
reload(sys)
sys.setdefaultencoding('utf-8') 
 
COMMON_FLAGS = ["error","exception","fail","crash","repair"]
 
def _contain_flag(cur_str):
  for flag in COMMON_FLAGS:
    if flag in string.lower(cur_str):
      return True
  return False
 
"""
獲取當前mysql例項的error_log檔案路徑
"""
def _get_mysql_error_log_path():
  log_path = ''
  grep_infos = os.popen('ps aux | grep mysql | grep "log-error"').read()
  if len(grep_infos) > 1:
    grep_infos = grep_infos.split("log-error=")
  if len(grep_infos) > 1:
    grep_infos = grep_infos[1].split(' ')
  if len(grep_infos) > 1:
    log_path = grep_infos[0]
  return log_path
 
"""
讀取mysql錯誤日誌中包含異常或錯誤資訊的行
"""
def _get_error_info(error_log,begin_date):
  error_infos = []
  f = open(error_log,'r')
  lines = f.readlines()
  for line in lines:
    data_array = line.split(' ')
    if len(data_array) > 0 and len(data_array[0]) == 10:
      dt_strs = data_array[0].split('-')
      cur_date = date(int(dt_strs[0]),int(dt_strs[1]),int(dt_strs[2]))
      if cur_date >= begin_date and _contain_flag(line):
        error_infos.append(line)
  f.close()
  return error_infos
 
"""
組裝並返回mysql錯誤日誌資訊
"""
def get_mysql_errors(begin_date=date.today()-timedelta(1)):
  try:
    err_log_path = _get_mysql_error_log_path()
    if len(err_log_path) > 1:
      return _get_error_info(err_log_path,begin_date)
  except Exception,e:
    print "[get_mysql_errors]%s"%e  
  return []

有興趣的朋友們參考學習下,感謝大家對我們的支援。