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

时间:2016-11-29 15:26:19

标签: python python-2.7 amazon-redshift

我正在尝试将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,:',将日志按空格分成列表。之后,将列表转换为对象。

有人能建议我更好的方法来完成这项任务吗?

2 个答案:

答案 0 :(得分:0)

您可以编制正则表达式,然后从匹配的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')
    )

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

答案 1 :(得分:0)

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

有一篇关于它的好文章here