吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2467|回复: 2
收起左侧

[Python 转载] 【Python】NavicatPre查询日志监控并转存数据库

  [复制链接]
gdyflxw 发表于 2020-5-14 13:47
【瞎BB,不想看就跳过直接看正题吧】
起因:
某天,领导突然找到我说,上回的数据你给我再查一次!在Everything了半天之后,不得不确认,上回的SQL没保存。。。250行SQL就这样消失了。。。
突然发现,Navicat Premium 15这玩意有历史日志功能,很是兴奋,打开一看,MMP,只记录当天的。。。
怀念我用SSMS的时候,有个插件叫SQL Promp,也能记录历史来着,无意关掉也能找回,可惜现在的数据种类太TM多了。。。

于是:
存起来呗,可是,每天要手动存一次啊,麻烦,弄个自动转传的吧

最后:
自动转传?查起来还得一天一天的找?算了算了,干脆就实时监控吧,再传入数据库里头记录起来,以后再查就方便了

【正题】
勉强算得上是个工具?还是应该扔到编程言区?放错区的话见谅见谅。

语言:Python3
作用:监控Navicat Premium 15数据库管理工具的历史日志,并转存到py文件的同名目录下的Sqlite数据库(没有就会自动生成)
用法:
1、查看你的日志文件位置
打开Navicat Premium,在工具-->选项-->文件位置-->日志里面,打开这个文件夹,看看有没有这个文件【history.log】,没有,恭喜你,你可以不用看下去了,节省了你很多时间。
1.png

2.png

2、修改代码里面的【his_path】参数为你的文件路径:记得用'\\'双斜杠来把你复制的单斜杠换掉,当然,用反斜杠'/'换掉'\'也行,随你。
image.png

3、保存为xxxx.pyw文件,名字随你喜欢。

4、双击,看到xxxx.pyw文件同一目录下面生成了HisMon.db文件,运行OK。

5、百度怎么把一个pyw弄成承系统自动启动。

源码:
[Python] 纯文本查看 复制代码
# -*- coding:utf8 -*-
import time
import re
import sqlite3

# History file path
his_path = 'filepath\\history.log'  # 这里填入你的log路径

# connect DB
conn = sqlite3.connect('HisMon.db')
c = conn.cursor()
c.execute("select count(*) from sqlite_master WHERE type='table' AND name='hisSQL'")
r = c.fetchall()
if str(r[0][0]) == '0':
    csql="""create table hisSQL(id integer PRIMARY KEY autoincrement,rundate datetime
            ,connname varchar(50),dbname varchar(50),sql text)"""
    c.execute(csql)
    conn.commit()

# ignoreSQL list 忽略列表,Navicat的历史日志把它自己的那些自动完成之类的SQL也记录在内了,把其中一次过滤掉了,还看到其他的话,自己添加吧,只要开头的一次字符做特征就可以了。
ignoreSQL=[
# MYSQL
'SHOW TABLE STATUS','SHOW COLUMNS','SELECT DISTINCT ROUTINE_SCHEMA','SELECT TABLE_SCHEMA','SHOW FULL TABLES'
,'SELECT SCHEMA_NAME','SHOW VARIABLES LIKE'
# SQLITE
,'PRAGMA foreign_keys = ON','SELECT m.name AS name','SELECT name AS ObjectName','PRAGMA database_list'
,'SELECT name, seq AS auto_inc','SELECT *,rowid "NAVICAT_ROWID'
# PGSQL
,'SELECT rolname','SELECT t.oid','SELECT t.relname','SELECT n.nspname','SELECT c.oid','SELECT attname AS name'
,'SELECT d.oid','SHOW datestyle','SELECT DISTINCT datlastsysoid','SELECT o.name','SELECT cl.column_name'
,'SELECT col.table_schema','SELECT opc.oid','SELECT opr.oid','SELECT i.indrelid AS oid','SELECT r.routine_schema'
,'SELECT COUNT(*) FROM pg_class','SELECT oid, nspname'
# MSSQL
,'SELECT d.name db_name','SELECT TOP 0 *','SELECT av.name','SELECT ao.object_id AS oid','SELECT @@SPID'
,'SELECT COUNT(*) FROM information_schema','SELECT SERVERPROPERTY','SET DATEFORMAT','SELECT s.name AS name'
,'SELECT TABLE_SCHEMA','SELECT DISTINCT ROUTINE_SCHEMA','SELECT t.name','SELECT o.name','SELECT c.name'
,'SELECT OBJECT_NAME','SELECT s.name']

def ig(sqlstr):
    for i in ignoreSQL:
        if re.search(r'USE +\[.*?\]', sqlstr) is not None:
            return False
        if i in s:
            return False
    return True


tlist = []
slist = []

# Monitor
with open(his_path, 'r', encoding='utf8') as file:
    while True:
        line = file.readline()
        if line:
            if re.search(
                    r'\[(\d+-\d+-\d+ \d+:\d+:\d+\.\d+)\]\[(\w+)\]\[\w+\]\[(\w+)\]', line) is not None:
                if len(slist) > 0:
                    s = '\n'.join(slist)
                    sql = """insert into hisSQL(rundate,connname,dbname,sql)values(?,?,?,?)"""
                    if ig(s):
                        c.execute(sql, (tlist[0], tlist[1], tlist[2], s))
                tmp = re.search(
                    r'\[(\d+-\d+-\d+ \d+:\d+:\d+\.\d+)\]\[(\w+)\]\[\w+\]\[(\w+)\]', line)
                tlist = [tmp.group(1), tmp.group(2), tmp.group(3)]
                slist = []
            else:
                if len(line) > 0 and line != '\n':
                    slist.append(line.replace('\n', ' '))
        else:
            conn.commit()
            time.sleep(1)
        file.seek(0, 1)
conn.close()


代码简单,水平有限,大神莫笑,拜拜

免费评分

参与人数 1吾爱币 +1 收起 理由
谷小白 + 1 用心讨论,共获提升!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

xiaoaiai2468 发表于 2020-5-14 14:41
感谢分享,学习了
头像被屏蔽
王星星 发表于 2020-5-14 14:48
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-17 06:09

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表