我正在使用正则表达式来解析nginx日志。
我正在创建的其中一个字段是“消息”。有时这个组将包含一个JSON字符串。
如何在我的“消息”组中选择性地匹配以创建“json”组?
这是我现在的正则表达式:
(?<time>\d{4}\/\d{2}\/\d{2} \d{2}:\d{2}:\d{2}) \[(?<log_level>\w+)\] (?<pid>\d+).(?<tid>\d+): (?<message>.*)
以下是一条示例消息:
2017/12/02 12:45:40 [debug] 29#29: *7895 [lua] auth_client.lua:41: {"applicationName":"nginx", "applicationFunction":"auth-client" ,"logLevel": "DEBUG", "clientId":"xyz","requestId":"72e03798e9826f2c4b076e3779903edf","message":"Checking client credentials"}
使用我目前的正则表达式,我得到一个字段:
message: *7895 [lua] auth_client.lua:41: {"applicationName":"nginx-auth-filter", "applicationFunction":"auth-client" ,"logLevel": "DEBUG", "clientId":"ifly","requestId":"72e03798e9826f2c4b076e3779903edf","message":"Checking client credentials"}
我想要的是:
message: *7895 [lua] auth_client.lua:41: {"applicationName":"nginx-auth-filter", "applicationFunction":"auth-client" ,"logLevel": "DEBUG", "clientId":"ifly","requestId":"72e03798e9826f2c4b076e3779903edf","message":"Checking client credentials"}
json: {"applicationName":"nginx-auth-filter", "applicationFunction":"auth-client" ,"logLevel": "DEBUG", "clientId":"ifly","requestId":"72e03798e9826f2c4b076e3779903edf","message":"Checking client credentials"}
但是,有时消息不包含json,因此该组应该是可选的。
答案 0 :(得分:0)
您可以将此正则表达式与json string的可选组一起使用:
(?<time>\d{4}\/\d{2}\/\d{2} \d{2}:\d{2}:\d{2}) \[(?<log_level>\w+)\] (?<pid>\d+).(?<tid>\d+): (?<message>[^{]*(?<json>\{.*\})?.*)
这假设json文本以第一个{
开头,并以消息组中的最后一个}
结束。