如何获取日志字符串的最后一部分并将其解释为json?

时间:2017-01-18 16:18:35

标签: python json regex

我正在查看具有以下格式的日志消息

datetime log_message_type message_type server {json_string}

因此每行用空格分隔,每行总是有相同的字段,最后有一个json字符串,json块内有各种字段。

我想过用简单的

做这件事
with open('test.log', 'r') as f:
    for x in f:
        line = x.split()

        datetime         = line[0]
        log_message_type = line[1]
        message_type     = line[2]
        server           = line[3]
        json_string      = line[4]

除非我的json字符串中有空格,否则这会有效。

{ "foo" : "bar" }

这样做会把我的json字符串拆分到空格处。有没有什么方法可以使用正则表达式或其他东西在空格上分割,直到我到达该行的“json string”部分,然后保留其余部分?我尝试过像

这样的事情
line = re.compile(".*\s.*\s.*\s.*\s").split(x)

尝试根据json字符串部分之前的4个空格来解析行,但是我恐怕我对python中的正则表达式系统是如何工作的还不够了解。有人能帮我一把吗?

编辑:忘了提,我为此坚持使用python 2.7。

4 个答案:

答案 0 :(得分:6)

限制拆分次数:

line = x.split(maxsplit=4)

>>> "a b c d my json expression".split(maxsplit=4)
['a', 'b', 'c', 'd', 'my json expression']

注意:python 2参数不同,你必须作为位置传递(也适用于python 3 BTW):

line = x.split(None,4)

答案 1 :(得分:5)

尝试这样的事情。正则表达式很快就会失控。

log_line = "datetime log_message_type message_type server {json_string}"
json_part = log_line.split(None, 4)[-1]

答案 2 :(得分:2)

如果你正在使用python 3,你可以利用extended iterable unpacking

$this->id

答案 3 :(得分:1)

这样的事情怎么样?

line = "datetime log_message_type message_type server {json_string}" 

re.search(r"(\S+) (\S+) (\S+) (\S+) {(\S+)}", line).groups()

输出:

('datetime', 'log_message_type', 'message_type', 'server', 'json_string')