VMware 5.1 の vCenter Server Appliance で ログを外部の syslog サーバーに送った話

# VMware 5.1 の vCenter Server Appliance で ログを外部の syslog サーバーに送った話

## このエントリは
- VMware 6 __より前__の VMware vCenter Server Appliance (VCSA) は、標準/GUI で syslog にログを送り出す設定ができない。
- が、VMware 5.1 でも、VCSA に内蔵している syslog-ng に設定を追加して 送り出すための設定情報があった(後述:英語)。 それを参考に設定してみた記録である。
- なお /var/log/messages も送り出したいので、不要な文字列をフィルタしながら送出することにする。

## 概要
### 手順
1. root で VCSA に ssh 接続
1. /etc/syslog-ng/syslog-ng.conf を バックアップを取った後、後述のように編集
1. `syslog-ng -s` で ファイルの文法チェック
1. `service syslog reload` で サービスの設定再読み込み
1. ``logger -p warn -t "MY_TEST" "TEST MESSAGE on `hostname` with logger command"`` などで テストのログを書き込み
1. 送り出した先で テストのログが受信できていることを確認

### 設定内容
- VCSA の syslog-ng に、vCenter Server の出力するログファイル群を監視させて、外部に送り出させる。
- 一緒に VCSA の OS 部分のログ /var/log/messages も同様に送り出す。[^1]
- 設定のうち、 /var/log/messages 分については、下記のように 除外用のフィルタ定義を行っている。
 - `"/cron"` ‥‥‥ 頻発している crond 関連の出力 
 - `" lsassd"` ‥‥ ActiveDirectory 関連のログ (当該環境では未使用) (1文字目の `l` の前に 半角スペースを含む)
 - `"Log statistics;"` ‥‥ 定期的に syslog-ng が出力する情報

[^1]: 標準の設定で /var/log/messages をカバーしている記載もあるが、単純化のため別の source を定義した。

## 注意点
- 受け側 (当方では rsyslog だった) では、__全てのログが なぜか kern.emerg 扱い__になってしまい、facility と level が消えてしまった。__未解決__ だが受容した。 

## 参照情報： 
- [Forwarding vCenter Server Logs to a Syslog Server](http://www.virtuallyghetto.com/2012/08/forwarding-vcenter-server-logs-to.html "ForwardVCSALogToSyslog")
- [VMware KB: vCenter Server ログ ファイルの場所 (2078751)](https://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2078751 "VMKB:2078751")


## 設定内容
### 編集箇所： 
- `syslog-ng.conf` の末尾に 下記を追記した

```config:/etc/syslog-ng/syslog-ng.conf
###
###  LOCAL SETTINGS
###
# Please check syntax with this command before restart service..
# syslog-ng -s

#### see also: http://www.virtuallyghetto.com/2012/08/forwarding-vcenter-server-logs-to.html
#### see also: https://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2078751

# vpxd source log
source vpxd {
       file("/var/log/vmware/vpx/vpxd.log"                follow_freq(1) flags(no-parse));
       file("/var/log/vmware/vpx/vpxd-alert.log"          follow_freq(1) flags(no-parse));
       file("/var/log/vmware/vpx/vws.log"                 follow_freq(1) flags(no-parse));
       file("/var/log/vmware/vpx/vmware-vpxd.log"         follow_freq(1) flags(no-parse));
       file("/var/log/vmware/vpx/inventoryservice/ds.log" follow_freq(1) flags(no-parse));
};
source local_messages {
       file("/var/log/messages" follow_freq(1) flags(no-parse));
};

# filter low-level
## messages 内で不要なエントリを除外するフィルタ
filter f_notneed_str1   { not match("/cron") and not match(" lsassd") and not match("Log statistics;"); } ;
## レベルを絞るフィルタ
filter f_remote_error   { level( err..emerg)     ; } ;
filter f_remote_warning { level( warning..emerg) ; } ;
filter f_remote_notice  { level( notice..emerg)  ; } ;


# Remote Syslog Host
destination remote_syslog {
   #    udp("[他のsyslogサーバIP]" port (514));
        tcp("[他のsyslogサーバIP]" port (514));
};

# Log vCenter Server vpxd to remote log server
log {
        source(vpxd);
        filter(f_remote_warning);
        destination(remote_syslog);
};
# Log vCenter Server's /var/log/messages to remote log server, with some filterring
log {
        source(local_messages);
        filter(f_remote_warning);
        filter(f_notneed_str1);
        destination(remote_syslog);
};
```

以上