生ログを構造化ログに変換するツールlrepに日時パース機能をつけた
の続きです。
ログからSQLiteのDDLやクエリを生成できるなら日時は日時としてパースできたほうが使い勝手がいいと思い実装しました*1。
名前付き正規表現でログの日時部分に名前をつけて(以下のサンプルだと time
)、そのキーを --ts-key (-k)
で、時刻フォーマットを --ts-format (-T)
で指定することで日時をパースしてSQLiteのクエリに反映させます。
$ tail -f /var/log/access.log | lrep -t sqlite --no-m0 '^(?P<host>\S*) \S* \S* \[(?P<time>.*)\] "(?P<request>.*)" (?P<status>\S*) (?P<bytes>\S*)' -k time -T '%d/%b/%Y:%H:%M:%S %z' CREATE TABLE IF NOT EXISTS lines ( id INTEGER PRIMARY KEY AUTOINCREMENT, host TEXT, time TIMESTAMP, request TEXT, status TEXT, bytes TEXT, _raw TEXT, created TIMESTAMP NOT NULL ); INSERT INTO lines(host, time, request, status, bytes, _raw, created) VALUES ('20.156.87.118', '2020-08-09 02:30:16', 'GET /category/electronics HTTP/1.1" 200 104 "/item/games/1927', '"Mozilla/4.0', '(com patible;', '20.156.87.118 - - [09/Aug/2020:11:30:16 +0900] "GET /category/electronics HTTP/1.1" 200 104 "/item/games/1927" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; WOW64; Trident/4.0; GTB6; SL CC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30618; .NET4.0C)"', datetime('now'));
日時をパースするためのフォーマットは strptime(3)のフォーマットでもGoのフォーマットでもOKです。
あとはビルトイン正規表現を増やすだけかなあ。。。