Loggingのログ・レコードの日時は、UTCで管理されています。カスタムログでOS内のログを収集する場合は、ログの日時がタイムゾーンから正しくUTC変換されているかどうかを意識する必要があります。
ここでは、タイムゾーンを指定する方法をいくつかご紹介します。
TomcatのアクセスログをREGEXPパーサーで取得する
以下のようなTomcatのデフォルトのアクセスログ(JST)に対してカスタムログのREGEXP(正規表現)パーサーを設定する場合の方法
116.82.XX.XX - - [18/Dec/2024:09:51:27 +0900] "GET /test/ HTTP/1.1" 200 6 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:133.0) Gecko/20100101 Firefox/133.0"
LoggingのカスタムログからREGEXPパーサーを作成する
#式
^(?<host>[^ ]*) (?<remotelog>[^ ]*) (?<user>[^ ]*) \[(?<logtime>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<status>[^ ]*) (?<size>[^ ]*)
#時間書式
%d/%b/%Y:%H:%M:%S %z
#時間キー
logtime
#時間キーの維持
True
以下の通り、JSTのアクセスログは、UTC変換されてLoggingに収集される
logtime = 18/Dec/2024:09:51:27 +0900 <---アクセスログ・レコードにある日時(JST)
time = 2024-12-18T00:51:27Z <--- logtimeをUTCに変換
ingestedtime = 2024-12-18T00:54:29.692979884Z <---Loggingに取り込んだ日時(UTC)
時間書式で%Z(タイムゾーン)を指定することで、時差が計算されてUTCとして格納され、Logging上で検索や表示が正しく行われます。
では、タイムゾーンがないログはどうすれば良いのか?
方法としてすぐに思いつくのはfluent.confのparseにタイムゾーンを直接指定することですが、LoggingのカスタムログはOCIコンソールでの設定しかサポートされていません。(直接記述してもコンソール設定に上書きされる)
方法としては、以下の二つが考えられます。
- OSのタイムゾーンを使う
- Grokパーサーでタイムゾーンを指定する
タイムゾーンを持っていないログを取り込む場合、LoggingはOSのタイムゾーンに合わせてログを取り込む挙動を行います。例えば、OSがJSTの場合、時差は-9時間なので、以下のようにLoggingのTimeフィールドは-9時間のUTC時刻に変換されます。
ログの日時(JST): 2024/12/18 17:56:30 --> LoggingのTimeフィールド: 2024-12-18T08:56:30Z
OSがUTCの場合は、ログの日時はそのまま取り込まれます。
ログの日時(JST): 2024/12/18 17:56:30 --> LoggingのTimeフィールド: 2024-12-18T17:56:30Z
私がテストしたREGEXPパーサーでは上記のような動作になっています。しかし、実際に期待したUTCへの変換になっているかどうかは、対象とするログやパーサーの種類・設定によって異なるかもしれませんので動作確認をお願いします。
Grokパーサーでタイムゾーンを指定する
Grokパーサーでは、コンソールから明示的にタイムゾーンを指定することができます。Grokパーサーの使い方や対応する日時のパターンは、Fluentdのドキュメント等で確認して下さい。ここでは、タイムゾーンがないDATESTAMP_EVENTLOGのパターンを使います。
DATESTAMP_EVENTLOGが検出する日時のフォーマットは、"YYYYMMDDHHMMSS"となるので、それに合わせるようにアクセスログの日時を以下のように書き換える
152.42.XX.XX - - [20241218175630] "GET /cdn-cgi/trace HTTP/1.1" 404 768
パターン:
%{IPORHOST:client_ip} %{USER:ident} %{USER:auth} \[%{DATESTAMP_EVENTLOG:timestamp}\] "%{WORD:method} %{DATA:request} HTTP/%{NUMBER:http_version}" %{NUMBER:response_code} %{NUMBER:bytes}.*$
フィールド時間書式:
%Y%m%d%H%M%S
フィールド時間キー:
timestamp
フィールドタイムゾーン
Asia/Tokyo
タイムゾーンのないJSTのtimestampは、-9時間されてLoggingに収集されている
timestamp = 20241218175630 <---ログレコードにある日時
time = 2024-12-18T08:56:30Z <--- timestampをUTCに変換
Grokパーサーのパターンで指定しているIPORHOST,DATESTAMP_EVENTLOGなどは、fluentdで定義済みのパターンを使用しています。本来は、ユーザー独自のパターンも使用することもできるのですが、Loggingのコンソールからはその設定ができないので、Logggingでは現状サポートされないと思ったほうが良いです。
そもそもログ自体にタイムゾーンが出力されていれば問題にならないので、まずは、ログ出力側でタイムゾーンを含むログ設定ができないかどうかを確認し、なければOSのタイムゾーンで取り込んだ際に時刻の不一致が出ていないかを順に確認していくと良いかと思います。