OCI Logging カスタムログのタイムゾーンについて

Loggingのログ・レコードの日時は、UTCで管理されています。カスタムログでOS内のログを収集する場合は、ログの日時がタイムゾーンから正しくUTC変換されているかどうかを意識する必要があります。

ここでは、タイムゾーンを指定する方法をいくつかご紹介します。

## TomcatのアクセスログをREGEXPパーサーで取得する
以下のようなTomcatのデフォルトのアクセスログ(JST)に対してカスタムログの<font color="Red">REGEXP(正規表現)パーサー</font color>を設定する場合の方法
```
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パーサーを作成する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/7324e14b-665f-0d39-e406-411884db09b2.png)
```
#式
^(?<host>[^ ]*) (?<remotelog>[^ ]*) (?<user>[^ ]*) \[(?<logtime>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<status>[^ ]*) (?<size>[^ ]*)

#時間書式
%d/%b/%Y:%H:%M:%S %z

#時間キー
logtime

#時間キーの維持
True
```

以下の通り、JSTのアクセスログは、UTC変換されてLoggingに収集される
<font color="Red">logtime</font color> = 18/Dec/2024:09:51:27 +0900 <---アクセスログ・レコードにある日時(JST)
<font color="Red">time</font color> = 2024-12-18T00:51:27Z <--- logtimeをUTCに変換
<font color="Red">ingestedtime</font color> = 2024-12-18T00:54:29.692979884Z　<---Loggingに取り込んだ日時(UTC)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/8dbb9e4a-6d92-a102-358f-48bc286e40bd.png)


時間書式で%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のドキュメント等で確認して下さい。ここでは、タイムゾーンがない<font color="Red">DATESTAMP_EVENTLOG</font color>のパターンを使います。

DATESTAMP_EVENTLOGが検出する日時のフォーマットは、"YYYYMMDDHHMMSS"となるので、それに合わせるようにアクセスログの日時を以下のように書き換える
```
152.42.XX.XX - - [20241218175630] "GET /cdn-cgi/trace HTTP/1.1" 404 768
```

カスタムログで、Grokパーサーを構成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/19fad6ee-78a8-4fa7-a41b-e7547c958ee4.png)


```
パターン:
%{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に収集されている
<font color="Red">timestamp</font color> = 20241218175630 <---ログレコードにある日時
<font color="Red">time</font color> = 2024-12-18T08:56:30Z <--- timestampをUTCに変換
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/043f2720-d869-b7eb-3832-d976c8dcdc9d.png)

Grokパーサーのパターンで指定している<font color="Red">IPORHOST,DATESTAMP_EVENTLOG</font color>などは、fluentdで定義済みのパターンを使用しています。本来は、ユーザー独自のパターンも使用することもできるのですが、Loggingのコンソールからはその設定ができないので、Logggingでは現状サポートされないと思ったほうが良いです。

そもそもログ自体にタイムゾーンが出力されていれば問題にならないので、まずは、ログ出力側でタイムゾーンを含むログ設定ができないかどうかを確認し、なければOSのタイムゾーンで取り込んだ際に時刻の不一致が出ていないかを順に確認していくと良いかと思います。