Synologyのログセンターのログ解析

# はじめに

自宅でSynologyのNAS DS120Jを使用しています。
単なるNASだけでなく、SysLogサーバとして「ログセンター」に自宅内のネットワーク機器のログを集約しているのですが、困ったことに重い重いGUIでしかログが見れないのでなんとかしたいと思います。


# ログセンターの仕様の調査

ログセンターでは受信したログは指定したディレクトリに保存されます。我が家の環境では、/volume1/syslog ディレクトリに保存されており、このような状況です。

```
synology@NAS:/volume1/syslog$ ls -la
total 1444
drwxrwxrwx+ 12 root   root   4096 Sep 24 10:49 .
drwxr-xr-x  26 root   root   4096 Sep 19 08:25 ..
drwxrwxrwx+  2 root   root   4096 Sep 24 03:51 192.168.100.1
drwxrwxrwx+  2 root   root   4096 Sep 24 04:18 192.168.100.110
～略～
-rwxrwxrwx+  1 system log  225280 Sep 24 03:49 SYNOSYSLOGDB__LOCALARCH_CON
-rwxrwxrwx+  1 system log   32768 Sep 24 11:05 SYNOSYSLOGDB__LOCALARCH_CON-shm
-rwxrwxrwx+  1 root   root  98912 Sep 24 11:05 SYNOSYSLOGDB__LOCALARCH_CON-wal
-rwxrwxrwx+  1 system log  593920 Sep 24 03:49 SYNOSYSLOGDB__LOCALARCH.DB
-rwxrwxrwx+  1 system log   32768 Sep 24 11:06 SYNOSYSLOGDB__LOCALARCH.DB-shm
-rwxrwxrwx+  1 root   root 243112 Sep 24 11:06 SYNOSYSLOGDB__LOCALARCH.DB-wal
-rwxrwxrwx+  1 system log   40960 Sep 24 03:49 SYNOSYSLOGDB__LOCALARCH_SYS
-rwxrwxrwx+  1 system log   32768 Sep 24 11:06 SYNOSYSLOGDB__LOCALARCH_SYS-shm
-rwxrwxrwx+  1 root   root  32992 Sep 24 11:06 SYNOSYSLOGDB__LOCALARCH_SYS-wal
-rwxrwxrwx+  1 system log   73728 Sep 23 03:46 SYNOSYSLOGDB__LOCALARCH_XFER
```

ネットワーク機器個別のログは、それそれのディレクトリに配置されていて、例えば192.168.100.110のシスログの場合は、↓の上な状態です。

```
synology@NAS:/volume1/syslog/192.168.100.110$ ls -la
total 2192
drwxrwxrwx+  2 root   root    4096 Sep 24 04:18 .
drwxrwxrwx+ 12 root   root    4096 Sep 24 10:49 ..
-rwxrwxrwx+  1 system log  1658880 Sep 24 03:49 SYNOSYSLOGDB_192.168.100.110.DB
-rwxrwxrwx+  1 system log    32768 Sep 24 10:18 SYNOSYSLOGDB_192.168.100.110.DB-shm
-rwxrwxrwx+  1 root   root  535632 Sep 24 10:19 SYNOSYSLOGDB_192.168.100.110.DB-wal
```

この、*.DBというファイルがログファイルの実体ですが、生ログではなくデータベース（SQLite）になっています。

このデータベースファイルの仕様はSynologyのサイトにも記載がないので、調べていきます。

## データベースファイル

### テーブル

テーブルの一覧を抽出してみます。

```
synology@NAS:/volume1/syslog/192.168.100.110$ sqlite3 SYNOSYSLOGDB_192.168.100.110.DB "SELECT name FROM sqlite_master WHERE type='table'"
logs
```

logs という名前のテーブルしかありませんね。

### スキーマ

logs テーブルのスキーマ情報を調べてみましょう。

```
synology@NAS:/volume1/syslog/192.168.100.110$ sqlite3 SYNOSYSLOGDB_192.168.100.110.DB ".schema logs"
CREATE TABLE logs (id integer primary key, host text default NULL, ip text default NULL, fac text default NULL, prio text default NULL, llevel text default NULL, tag text default NULL, utcsec int default NULL, r_utcsec int default NULL, tzoffset text default NULL, ldate date default CURRENT_DATE, ltime time default CURRENT_TIME, prog text default NULL, msg text default NULL);
CREATE INDEX logs_id_idx ON logs (id);
CREATE INDEX logs_llevel_idx ON logs (llevel);
CREATE INDEX logs_utcsec_idx ON logs (utcsec);
CREATE INDEX logs_r_utcsec_idx ON logs (r_utcsec);
CREATE INDEX logs_ldate_idx ON logs (ldate);
CREATE INDEX logs_ltime_idx ON logs (ltime);
```

なんとなく見えましたね。

|列|型|用途|
|-|-|-|
|id|integer|ID（主キー）|
|host|text|ホスト名|
|ip|text|IPアドレス|
|fac|text|ファシリティ|
|prio|text|優先度|
|llevel|text|レベル|
|tag|text|SysLogのタグ|
|utcsec|int|UNIX時間|
|r_utcsec|int|UNIX時間（SysLog送信元？）|
|tzoffset|text|タイムゾーン|
|ldate|date|日付|
|ltime|time|時刻|
|prog|text|プログラム名|
|msg|text|ログメッセージ|

こんな感じかと。


# ログの検索

本日のリンクダウンを抽出してみましょう。

```
synology@NAS:/volume1/syslog/192.168.100.110$ sqlite3 SYNOSYSLOGDB_192.168.100.110.DB "SELECT * FROM logs WHERE ldate='2023-09-24' AND msg LIKE '%UPDOWN%'"
5491|192.168.100.110|192.168.100.110|local7|err|err|bb|1695492066|1695492067|+09:00|2023-09-24|03:01:06|JST|%LINK-3-UPDOWN: Interface GigabitEthernet0/4, changed state to up
5492|192.168.100.110|192.168.100.110|local7|notice|notice|bd|1695492067|1695492067|+09:00|2023-09-24|03:01:07|JST|%LINEPROTO-5-UPDOWN: Line protocol on Interface GigabitEthernet0/4, changed state to up
5493|192.168.100.110|192.168.100.110|local7|notice|notice|bd|1695492933|1695492935|+09:00|2023-09-24|03:15:33|JST|%LINEPROTO-5-UPDOWN: Line protocol on Interface GigabitEthernet0/4, changed state to down
5494|192.168.100.110|192.168.100.110|local7|err|err|bb|1695492934|1695492936|+09:00|2023-09-24|03:15:34|JST|%LINK-3-UPDOWN: Interface GigabitEthernet0/4, changed state to down
5497|192.168.100.110|192.168.100.110|local7|err|err|bb|1695494465|1695494466|+09:00|2023-09-24|03:41:05|JST|%LINK-3-UPDOWN: Interface GigabitEthernet0/4, changed state to up
5498|192.168.100.110|192.168.100.110|local7|notice|notice|bd|1695494466|1695494466|+09:00|2023-09-24|03:41:06|JST|%LINEPROTO-5-UPDOWN: Line protocol on Interface GigabitEthernet0/4, changed state to up
5499|192.168.100.110|192.168.100.110|local7|notice|notice|bd|1695494941|1695494942|+09:00|2023-09-24|03:49:01|JST|%LINEPROTO-5-UPDOWN: Line protocol on Interface GigabitEthernet0/4, changed state to down
5500|192.168.100.110|192.168.100.110|local7|err|err|bb|1695494942|1695494943|+09:00|2023-09-24|03:49:02|JST|%LINK-3-UPDOWN: Interface GigabitEthernet0/4, changed state to down
```

はい、できました。
SQLが苦手な方は、ある程度絞ったあとでgrepで頑張っても良いかもしれません。

```
synology@NAS:/volume1/syslog/192.168.100.110$ sqlite3 SYNOSYSLOGDB_192.168.100.110.DB "SELECT * FROM logs WHERE ldate='2023-09-24'" | grep UPDOWN
5491|192.168.100.110|192.168.100.110|local7|err|err|bb|1695492066|1695492067|+09:00|2023-09-24|03:01:06|JST|%LINK-3-UPDOWN: Interface GigabitEthernet0/4, changed state to up
5492|192.168.100.110|192.168.100.110|local7|notice|notice|bd|1695492067|1695492067|+09:00|2023-09-24|03:01:07|JST|%LINEPROTO-5-UPDOWN: Line protocol on Interface GigabitEthernet0/4, changed state to up
5493|192.168.100.110|192.168.100.110|local7|notice|notice|bd|1695492933|1695492935|+09:00|2023-09-24|03:15:33|JST|%LINEPROTO-5-UPDOWN: Line protocol on Interface GigabitEthernet0/4, changed state to down
5494|192.168.100.110|192.168.100.110|local7|err|err|bb|1695492934|1695492936|+09:00|2023-09-24|03:15:34|JST|%LINK-3-UPDOWN: Interface GigabitEthernet0/4, changed state to down
5497|192.168.100.110|192.168.100.110|local7|err|err|bb|1695494465|1695494466|+09:00|2023-09-24|03:41:05|JST|%LINK-3-UPDOWN: Interface GigabitEthernet0/4, changed state to up
5498|192.168.100.110|192.168.100.110|local7|notice|notice|bd|1695494466|1695494466|+09:00|2023-09-24|03:41:06|JST|%LINEPROTO-5-UPDOWN: Line protocol on Interface GigabitEthernet0/4, changed state to up
5499|192.168.100.110|192.168.100.110|local7|notice|notice|bd|1695494941|1695494942|+09:00|2023-09-24|03:49:01|JST|%LINEPROTO-5-UPDOWN: Line protocol on Interface GigabitEthernet0/4, changed state to down
5500|192.168.100.110|192.168.100.110|local7|err|err|bb|1695494942|1695494943|+09:00|2023-09-24|03:49:02|JST|%LINK-3-UPDOWN: Interface GigabitEthernet0/4, changed state to down
```

こんな感じ。

# さいごに

とりあえず、重いGUIに依存せずにログの検索ができるようになりました。
ただ、tailができないのがつらいなぁ。なんかいい方法ないものか。