VMware Tanzu GemFire - ログ関連設定

こんにちは、@yama-s です。

TUNA-JP Advent Calendar 2023 第16日目を担当します！
宜しくお願いします。

TUNA-JP Advent Calendar に参加し、かれこれ3年目になります。
もしお時間あれば過去記事も覗いてみていただけると嬉しいです。

◆2021 … [Fluent Bit を利用した Splunk 連携](https://qiita.com/yama-s/items/cd5cf9621907ac387d6c)
◆2022 … [TKG 1.6 で Whereabouts を検証してみる](https://qiita.com/yama-s/items/f4da6ba64d6ae716b062)
◆2023 … 本記事

今年は VMware Tanzu GemFire のログ関連設定について紹介します。


# VMware Tanzu GemFire とは

VMware Tanzu GemFire は、読み取りおよび書き込みの処理を超高速で実行する
分散型のインメモリ キー バリューストアです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2317898/46535b4f-196d-721b-f7d0-cb1d0796dcd0.png)

# GemFire のログ管理

### ログレベル

一般に info, warn, emerg などログの重大度を示す識別子のことです。
GemFire のログレベルには以下の種類があります。

 |loglevel|
 |---|
 |none or off|
 |severe or fatal|
 |error|
 |warning or warn|
 |info or config|
 |fine or debug|
 |finer or trace|
 |finest or trace|
 |all|

「or」で並べた 2つは同じレベルです（指定名が異なるだけ）

#### 変更例

実際に変更してみましょう。
デフォルトでは config (=info) レベルです。

>メモ：config という指定値に慣れていなかったため最初？？？でした

gemfire.properties を使用します。

```:/gfsh実行ディレクトリ/gemfire.properties
log-level fine
```

`start locator` コマンドを使用し、
`--properties-file` オプションでファイル名（今回は `gemfire.properties`）を指定して locator を起動します。

```
[root@rhel88-01 work_gemfire]# gfsh
    _________________________     __
   / _____/ ______/ ______/ /____/ /
  / /  __/ /___  /_____  / _____  /
 / /__/ / ____/  _____/ / /    / /
/______/_/      /______/_/    /_/    10.0.1

Monitor and Manage VMware GemFire
gfsh>
gfsh>
gfsh>
gfsh>start locator --name locator1 --bind-address 10.xx.xx.161 --port 6001 --properties-file=gemfire.properties
Starting a GemFire Locator in /root/work_gemfire/locator1...
.......................
Locator in /root/work_gemfire/locator1 on 10.xx.xx.161[6001] as locator1 is currently online.
Process ID: 18858
Uptime: 14 seconds
Geode Version: 10.0.1
Java Version: 11.0.21
Log File: /root/work_gemfire/locator1/locator1.log
JVM Arguments: --add-exports=java.management/com.sun.jmx.remote.security=ALL-UNNAMED --add-exports=java.base/sun.nio.ch=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.nio=ALL-UNNAMED -DgemfirePropertyFile=/root/work_gemfire/gemfire.properties -Dgemfire.enable-cluster-configuration=true -Dgemfire.load-cluster-configuration-from-dir=false -Dgemfire.launcher.registerSignalHandlers=true -Djava.awt.headless=true -Dsun.rmi.dgc.server.gcInterval=9223372036854775806
Class-Path: /root/work_gemfire/zzz_shizai/vmware-gemfire-10.0.1/lib/gemfire-bootstrap-10.0.1.jar

Successfully connected to: JMX Manager [host=wxxxxxx.vmware.com, port=1099]

Cluster configuration service is up and running.

gfsh>
```

`loactor1` が起動できました。

#### 結果確認

出力されたログを確認します。

```:gemfire 起動ディレクトリ/name/name.log
# 変更前（デフォルト）
[info 2023/12/15 11:37:59.587 EST locator2 <main> tid=0x1] Locator started on 10.xx.xx.161[6002]

[info 2023/12/15 11:37:59.588 EST locator2 <main> tid=0x1] Starting server location for Distribution Locator on 10.xx.xx.161[6002]

[info 2023/12/15 11:37:59.624 EST locator2 <WAN Locator Discovery Thread2> tid=0x5d] Locator discovery task for locator 10.xx.xx.161[6002] exchanged locator information with wxxxxxx.vmware.com[6002]: {-1=[DistributionLocatorId{host=wxxxxxx.vmware.com/10.xx.xx.161, port=6001, bindAddress='10.xx.xx.161', hostnameForClients='null', hostname='null', memberName='locator1', timestamp=1702657827287}, DistributionLocatorId{host=wxxxxxx.vmware.com/10.xx.xx.161, port=6002, bindAddress='10.xx.xx.161', hostnameForClients='null', hostname='null', memberName='locator2', timestamp=1702658279604}]}.

[info 2023/12/15 11:37:59.625 EST locator2 <WAN Locator Discovery Thread1> tid=0x5c] Locator discovery task for locator 10.xx.xx.161[6002] exchanged locator information with 10.xx.xx.161[6001]: {-1=[DistributionLocatorId{host=wxxxxxx.vmware.com/10.xx.xx.161, port=6001, bindAddress='10.xx.xx.161', hostnameForClients='null', hostname='null', memberName='locator1', timestamp=1702657827287}]}.
```

```:gemfire 起動ディレクトリ/name/name.log
# 変更後
[debug 2023/12/15 11:36:03.541 EST locator1 <Geode Failure Detection Scheduler1> tid=0x27] cluster health monitor invoked with null

[debug 2023/12/15 11:36:03.541 EST locator1 <Geode Failure Detection Scheduler1> tid=0x27] cluster health monitor pausing

[debug 2023/12/15 11:36:05.256 EST locator1 <Management Task1> tid=0x39] size of put result is 1 maps is {GemFire:type=Member,member=locator1=ObjectName = GemFire:type=Member,member=locator1} proxyResult is null

[debug 2023/12/15 11:36:05.256 EST locator1 <Management Task1> tid=0x39] recording bulkOp start for ThreadId[10.xx.xx.161(locator1:locator)<ec><v0>:54764; thread 819273]

[debug 2023/12/15 11:36:05.257 EST locator1 <Management Task1> tid=0x39] putAll GemFire:type=Member,member=locator1 -> ObjectName = GemFire:type=Member,member=locator1

[debug 2023/12/15 11:36:05.258 EST locator1 <Management Task1> tid=0x39] <No Recipients> DistributedPutAllOperation(EntryEventImpl[op=PUTALL_CREATE;region=/_monitoringRegion_10.xx.xx.161<v0>54764;key=null;callbackArg=null;originRemote=true;originMember=10.xx.xx.161(locator1:18858:locator)<ec><v0>:54764;id=EventID[10.xx.xx.161(locator1:locator)<ec><v0>:54764;threadID=819273;sequenceID=186]])
```

ログレベルが変更されました！
出力内容が詳しくなったことを確認できました。出力頻度も高いです（数ミリ秒毎）
各行の1カラム目にログレベルの記載があります。

>メモ：locator1 起動時に先に設定変更してしまったため、デフォルトとの比較用に locator2 を新規作成（gemfire.properties 指定なし）でログを取ってきました。そのため名前が異なっています

gemfire.properties 以外では、gfsh コマンドラインや起動時のオプションで変更する方法などがあります。
gfsh コマンドラインでの書式と実行例は以下です。
```
change loglevel --loglevel=value [--members=value(,value)*] [--groups=value(,value)*]
```

```
# 実行例
change loglevel --loglevel=ERROR --members=locator1
```

--loglevel は `ALL`, `TRACE`, `DEBUG`, `INFO`, `WARN`, `ERROR`, `FATAL`, `OFF` から指定します。
--members は \<server name\> または \<locator name\> を指定します。

---
### ログサイズ（ファイル毎）

#### 変更例
次に個々のログファイルサイズの設定です。実際に変更してみましょう。
gemfire.properties を使用します。
（単位は MB）

```:/gfsh実行ディレクトリ/gemfire.properties
log-file-size-limit 1
```

ここでは「1MB」に設定しました。

`start server` コマンドを使用し、
`--properties-file` オプションを付与して server を起動します。

```
gfsh>start server --name server1 --bind-address 10.xx.xx.161 --server-port=6101 --properties-file=gemfire.properties
Starting a GemFire Server in /root/work_gemfire/server1...
........
Server in /root/work_gemfire/server1 on wxxxxxx.vmware.com[6101] as server1 is currently online.
Process ID: 19558
Uptime: 6 seconds
Geode Version: 10.0.1
Java Version: 11.0.21
Log File: /root/work_gemfire/server1/server1.log
JVM Arguments: --add-exports=java.management/com.sun.jmx.remote.security=ALL-UNNAMED --add-exports=java.base/sun.nio.ch=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.nio=ALL-UNNAMED -DgemfirePropertyFile=/root/work_gemfire/gemfire.properties -Dgemfire.bind-address=10.xx.xx.161 -Dgemfire.start-dev-rest-api=false -Dgemfire.use-cluster-configuration=true -XX:OnOutOfMemoryError=kill -KILL %p -Dgemfire.launcher.registerSignalHandlers=true -Djava.awt.headless=true -Dsun.rmi.dgc.server.gcInterval=9223372036854775806
Class-Path: /root/work_gemfire/zzz_shizai/vmware-gemfire-10.0.1/lib/gemfire-bootstrap-10.0.1.jar

gfsh>
gfsh>
gfsh>start server --name server2 --bind-address 10.xx.xx.161 --server-port=6102 --properties-file=gemfire.properties
Starting a GemFire Server in /root/work_gemfire/server2...
(中略)

gfsh>
gfsh>
gfsh>start server --name server3 --bind-address 10.xx.xx.161 --server-port=6103 --properties-file=gemfire.properties
Starting a GemFire Server in /root/work_gemfire/server3...
(中略)

gfsh>
```

#### 結果確認

設定の有無は以下です。
ローテーション設定あり： `locator1`, `locator2`
ローテーション設定なし： `locator3`, `server1`, `server2`, `server3`

```
# ローテーション前
[root@rhel88-01 work_gemfire]# ll locator*/locator*.log server*/server*.log -h
-rw-r--r--. 1 root root 5.8M 12ŒŽ 15 12:26 locator1.log
-rw-r--r--. 1 root root  33K 12ŒŽ 15 11:37 locator2.log
-rw-r--r--. 1 root root 860K 12ŒŽ 15 12:26 locator3.log
-rw-r--r--. 1 root root 875K 12ŒŽ 15 12:26 server1.log
-rw-r--r--. 1 root root 861K 12ŒŽ 15 12:26 server2.log
-rw-r--r--. 1 root root 850K 12ŒŽ 15 12:26 server3.log
[root@rhel88-01 work_gemfire]#
```

```
# ローテーション後
[root@rhel88-01 work_gemfire]# ll locator*/locator*.log server*/server*.log -h
-rw-r--r--. 1 root root 8.3M 12ŒŽ 15 12:49 locator1/locator1.log
-rw-r--r--. 1 root root  33K 12ŒŽ 15 11:37 locator2/locator2.log
-rw-r--r--. 1 root root 1.1M 12ŒŽ 15 12:31 locator3/locator3-01-01.log
-rw-r--r--. 1 root root 636K 12ŒŽ 15 12:49 locator3/locator3.log
-rw-r--r--. 1 root root 1.1M 12ŒŽ 15 12:29 server1/server1-01-01.log
-rw-r--r--. 1 root root 822K 12ŒŽ 15 12:49 server1/server1.log
-rw-r--r--. 1 root root 1.1M 12ŒŽ 15 12:30 server2/server2-01-01.log
-rw-r--r--. 1 root root 808K 12ŒŽ 15 12:49 server2/server2.log
-rw-r--r--. 1 root root 1.1M 12ŒŽ 15 12:30 server3/server3-01-01.log
-rw-r--r--. 1 root root 797K 12ŒŽ 15 12:49 server3/server3.log
[root@rhel88-01 work_gemfire]#
```
設定を入れた `locator3`, `server1`, `server2`, `server3` がファイルサイズ 1MB 程度でローテーションされ、別名ファイル（`name-01-01.log`）に出力されるようになっていることが確認できました。

---

### ログサイズ（ログ全体の合計値）

#### 変更例
続いて各ログファイル合計の上限サイズの設定です。実際に変更してみましょう。
gemfire.properties を使用します。
（単位は MB）

```:/gfsh実行ディレクトリ/gemfire.properties
log-disk-space-limit 2
```

ここでは「2MB」に設定しました。

`start server` コマンドを使用し、
`--properties-file` オプションを付与して server を起動します。

>メモ：前項と同じ server を使用して確認しました

```
gfsh>start server --name server1 --bind-address 10.xx.xx.161 --server-port=6101 --properties-file=gemfire.properties
Starting a GemFire Server in /root/work_gemfire/server1...
(中略)

gfsh>
gfsh>
gfsh>start server --name server2 --bind-address 10.xx.xx.161 --server-port=6102 --properties-file=gemfire.properties
Starting a GemFire Server in /root/work_gemfire/server2...
(中略)

gfsh>
gfsh>
gfsh>start server --name server3 --bind-address 10.xx.xx.161 --server-port=6103 --properties-file=gemfire.properties
Starting a GemFire Server in /root/work_gemfire/server3...
(中略)

gfsh>
```

#### 結果確認

設定の有無は以下です。
ローテーション設定あり： `locator1`, `locator2`
ローテーション設定なし： `locator3`, `server1`, `server2`, `server3`

```
# ローテーション前
[root@rhel88-01 work_gemfire]# ll locator*/locator*.log server*/server*.log -h
-rw-r--r--. 1 root root 5.8M 12ŒŽ 15 12:26 locator1.log
-rw-r--r--. 1 root root  33K 12ŒŽ 15 11:37 locator2.log
-rw-r--r--. 1 root root 860K 12ŒŽ 15 12:26 locator3.log
-rw-r--r--. 1 root root 875K 12ŒŽ 15 12:26 server1.log
-rw-r--r--. 1 root root 861K 12ŒŽ 15 12:26 server2.log
-rw-r--r--. 1 root root 850K 12ŒŽ 15 12:26 server3.log
[root@rhel88-01 work_gemfire]#
```

```
# ローテーション後
[root@rhel88-01 work_gemfire]# ll locator*/locator*.log server*/server*.log -h
-rw-r--r--. 1 root root 8.3M 12ŒŽ 15 12:49 locator1/locator1.log
-rw-r--r--. 1 root root  33K 12ŒŽ 15 11:37 locator2/locator2.log
-rw-r--r--. 1 root root 1.1M 12ŒŽ 15 12:31 locator3/locator3-01-01.log
-rw-r--r--. 1 root root 636K 12ŒŽ 15 12:49 locator3/locator3.log
-rw-r--r--. 1 root root 1.1M 12ŒŽ 15 12:29 server1/server1-01-01.log
-rw-r--r--. 1 root root 822K 12ŒŽ 15 12:49 server1/server1.log
-rw-r--r--. 1 root root 1.1M 12ŒŽ 15 12:30 server2/server2-01-01.log
-rw-r--r--. 1 root root 808K 12ŒŽ 15 12:49 server2/server2.log
-rw-r--r--. 1 root root 1.1M 12ŒŽ 15 12:30 server3/server3-01-01.log
-rw-r--r--. 1 root root 797K 12ŒŽ 15 12:49 server3/server3.log
[root@rhel88-01 work_gemfire]#
```

```
# ファイル保持上限超過後
[root@rhel88-01 work_gemfire]# ll locator*/locator*.log server*/server*.log -h
-rw-r--r--. 1 root root 9.2M 12ŒŽ 15 12:57 locator1/locator1.log
-rw-r--r--. 1 root root  33K 12ŒŽ 15 11:37 locator2/locator2.log
-rw-r--r--. 1 root root 1.1M 12ŒŽ 15 12:31 locator3/locator3-01-01.log
-rw-r--r--. 1 root root 908K 12ŒŽ 15 12:57 locator3/locator3.log
-rw-r--r--. 1 root root 1.1M 12ŒŽ 15 12:54 server1/server1-01-02.log
-rw-r--r--. 1 root root 139K 12ŒŽ 15 12:57 server1/server1.log
-rw-r--r--. 1 root root 1.1M 12ŒŽ 15 12:54 server2/server2-01-02.log
-rw-r--r--. 1 root root 125K 12ŒŽ 15 12:57 server2/server2.log
-rw-r--r--. 1 root root 1.1M 12ŒŽ 15 12:54 server3/server3-01-02.log
-rw-r--r--. 1 root root 114K 12ŒŽ 15 12:57 server3/server3.log
[root@rhel88-01 work_gemfire]#
```

設定を入れた `locator3`, `server1`, `server2`, `server3` で上限を超過したものは、
`name-01-01.log` から `name-01-02.log` にローテーションされ、ファイル保持サイズ上限が 2MB となっていることが確認できました。

ここまでで、以下 3つについて設定前後の比較を行いました。
- ログレベル
- ログファイルサイズ
- ログファイルの合計サイズ上限値

# さいごに
GemFire とても良いプロダクトだと思います。習熟したいです。

参考：[VMware GemFire 10 Documentation](https://docs.vmware.com/en/VMware-GemFire/10.0/gf.pdf)

記事は以上です。ここまで読んでいただきありがとうございました。
みなさま良い年末を！！

@yama-s
Sayaka Yamauchi