如何将 AWS Redshift 用户活动日志解析为对象?

Posted

技术标签:

【中文标题】如何将 AWS Redshift 用户活动日志解析为对象?【英文标题】:How to parse AWS Redshift User Activity Log into an object? 【发布时间】:2016-11-29 15:26:18 【问题描述】:

我正在尝试将 AWS Redshift 用户活动日志 (http://docs.aws.amazon.com/redshift/latest/mgmt/db-auditing.html) 解析为一个对象。

Redshift 用户活动日志

'2016-11-16T08:00:13Z UTC [ db=dev user=rdsdb pid=30500 userid=1 xid=1520 ]' LOG: SELECT 1

Python RedshiftUserActivityLog 对象

class RedshiftUserActivtyLog (object):    
        def __init__(self, record_time, db,
                 user, pid, user_id, xid,
                 query):
        super(RedshiftUserActivtyLog , self).__init__()

        self.record_time = record_time
        self.db = db
        self.user = user
        self.pid = pid
        self.user_id = user_id
        self.xid = xid
        self.query = query

我目前的解决方案是删除不必要的字符,如'[、]、UTC、LOG、:',将日志按空格拆分为列表。之后,将列表转换为对象。

谁能建议我完成这项任务的更好方法?

【问题讨论】:

【参考方案1】:

您可以编写一个正则表达式,然后从匹配的groupdict() 填充您的对象,例如

regex = re.compile(r'\'(?P<time>[\d\-:T]+)\w UTC \[ db=(?P<db>\w+) user=(?P<user>\w+) pid=(?P<pid>\d+) userid=(?P<userid>\d+) xid=(?P<xid>\d+) \]\' LOG:(?P<query>.*)')
match = regex.search(log)
if match:
    userActivity = RedshiftUserActivtyLog(
        record_time=match.group('time'),
        db=match.group('db'),
        user=match.group('user'),
        pid=match.group('pid'),
        user_id=match.group('user_id'),
        xid=match.group('xid'),
        log=match.group('log')
    )

但实际上你的方式也很合法,甚至可能更快。

【讨论】:

【参考方案2】:

解析 Redshift 审计日志的另一种方法是通过Amazon Redshift Spectrum。

有一篇很好的博客文章here。

【讨论】:

以上是关于如何将 AWS Redshift 用户活动日志解析为对象?的主要内容,如果未能解决你的问题,请参考以下文章

AWS:将日志从 Amazon CloudWatch 导出到 Amazon Redshift

AWS:从 dynamodb 到 redshift 的数据转换 [关闭]

如何授予 Amazon Redshift 用户读取系统表、视图、日志等的访问权限?

注册 AWS Redshift 活动

如何让现有用户成为 AWS Redshift 中的超级用户

如何使用 aws unload 命令将数据从 AWS Redshift 卸载到 s3?