2017-12-03 12 views
0

私は正規表現を使ってnginxログを解析しています。オプションで正規表現グループ内で一致する

作成しているフィールドの1つが「メッセージ」です。このグループにはJSON文字列が含まれることがあります。

「json」グループを作成するために、私の「メッセージ」グループ内で任意に一致させる方法はありますか?ここで

は私の現在の正規表現です:私が望む何

message: *7895 [lua] auth_client.lua:41: {"applicationName":"nginx-auth-filter", "applicationFunction":"auth-client" ,"logLevel": "DEBUG", "clientId":"ifly","requestId":"72e03798e9826f2c4b076e3779903edf","message":"Checking client credentials"} 

されています。私の現在の正規表現で

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"} 

私はのようなフィールドを取得:

(?<time>\d{4}\/\d{2}\/\d{2} \d{2}:\d{2}:\d{2}) \[(?<log_level>\w+)\] (?<pid>\d+).(?<tid>\d+): (?<message>.*) 

ここでは例のメッセージです:

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

あなたは、JSON文字列のためのオプションのグループで、この正規表現を使用することができます。

(?<time>\d{4}\/\d{2}\/\d{2} \d{2}:\d{2}:\d{2}) \[(?<log_level>\w+)\] (?<pid>\d+).(?<tid>\d+): (?<message>[^{]*(?<json>\{.*\})?.*) 

これは想定しているJSONテキストは、最初の{で始まり、メッセージ・グループ内の最後の}で終わります。

RegEx Demo

+0

これはほとんど機能しますが、時にはメッセージを終了しません}。この場合、マッチは機能しません。 たとえば、メッセージ「 」、クライアント:172.19.0.123、サーバー:nginx.services.xxx.com、リクエスト:「POST /イベント/メンバーHTTP/1.1」、ホスト:「api .xxx.com " – wimnat

+0

また、私の更新された正規表現を試してください。それが動作しない場合は、新しいサンプルデータで質問を編集し、予想される一致を表示してください。 – anubhava

関連する問題