Guavaスプリッタを使用してログファイルを解析しようとしています。ログファイルは次のようになります。Guavaスプリッタをキー値マップに文字列に含まれるスプリッタ文字で埋め込みます。
appName=XXX clientIp=X.X.X timestamp="2017-06-05T13:22:12-07:00" request="POST /forward HTTP/1.1" statusCode=204 bytesOut=1167 totalTime=0.062 bytesIn=1289 sourceHost=XXXX connId=49936598 connReqs=9 upInstance=XXX:104:XXX-XXX:8664:17F34 upConnectSec=0.052 upAddr="XX.XX.XX:123" upHost="vcv08it-cvcv2801:8464" upHdrTimeSec=0.058 upRespTimeSec=0.058 pid=32561 upStatusCode=204 message="Access Log" corrKey=GMIFCDIKRZR2T4VZQXJA2IT6 upCached=- length=0 partition=XXX location="= /v1/tXXXX" xff="XX.XX.XX.XX" referer="-" user-agent="Apache-HttpAsyncClient/4.1.1 (Java/1.8.0_131)\" rateLimitCurrentValues="--" rateLimitTimeMs=\"-:-"
私はそれを解析するためにこのコードを使用:
Map<String, String> parserMap;
parserMap = Splitter.onPattern("\\s(?=([^\\\"]*\\\"[^\\\"]*\\\")*[^\\\"]*$)")
.omitEmptyStrings()
.withKeyValueSeparator(Splitter.onPattern("="))
.split(line);
私の問題は、文字列内の「=」を持っている場所=「=/V1/TXXXX」フィールドで、 current withKeyValueSeperatorはそれを解析できません。すべてのフィールドを正しく取得するためにパターンを変更する方法を教えてください。
この作業を行うことができれば、私は軽く驚いています。これを処理するのに十分なスマートなカスタムが必要かもしれません。 –
@LouisWasserman、ファンシーなものを使用する必要はありません...正規表現を使って実行できます –