首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析postgres日志以了解用户对表的使用情况

解析postgres日志以了解用户对表的使用情况
EN

Stack Overflow用户
提问于 2018-09-05 00:55:06
回答 1查看 312关注 0票数 0

作为数据库清理工作的一部分,我正在对现有数据库表的使用量和用户进行审计。使用日志文件似乎是获取此数据的一种自然方式。我们为性能报告运行了pgBadger,但我所描述的使用情况报告并不存在。谁知道有什么工具(pgBadger或其他工具)可以从日志中提取表和用户信息,以便我可以计算其中的汇总统计信息?我喜欢利用现有的工具,而不是使用我自己的日志解析器。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-13 11:38:36

我写了一个粗俗的日志解析器。

代码语言:javascript
复制
import re
import psqlparse
import json

statement_re = r"^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} UTC:[^:]*:(?P<user>\w+)@(?P<db>\w+):.*statement:\s+(?P<stmt>.*)"
log_re = r"^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}"

def parse_logs(log_file):
    with open(log_file, 'r') as f:
        state = 'looking'
        info = None
        for line in f:
            if state == 'found':
                if re.match(log_re, line) is None:
                    info['stmt'].append(line.strip())
                else:
                    info['stmt'] = "\n".join(info['stmt']).strip()
                    try:
                        parsed_stmt = psqlparse.parse(info['stmt'])[0]
                        info['stmt_type'] = str(type(parsed_stmt)).split(".")[-1][0:-6].lower()
                        info['tables'] = list(parsed_stmt.tables())
                    except:
                        pass
                    print(json.dumps(info))
                    state = 'looking'
            if state == 'looking':
                m = re.match(statement_re, line)
                if m is not None:
                    stmt = m.group('stmt')
                    if stmt not in {'BEGIN', 'COMMIT', 'ROLLBACK', 'SELECT 1'} and 'show' not in stmt:
                        info = {'user': m.group('user'), 'stmt': [stmt]}
                        state = 'found'

parse_logs('postgresql.log')

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52170914

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档