CentOS7のログ転送設定

# はじめに
CentOSはrsyslogを使用してログを他サーバーに転送する機能があります。
こちらの機能を使って、他サーバーにシステムログとApache httpのログを転送する方法をまとめました。

# 前提条件
送信側、受信側共にCentOS7.6環境を使用しています。
Apache httpはyumでインストールしています。バイナリーからインストールした場合は、パスが異なる場合がありますのでご注意ください。

# 実施内容
システムログを他サーバーに転送するための設定とApache httpのログを転送するための設定の２つに分けて説明していきます。


## １．システムログを他サーバーへ転送する設定
rsyslogの転送機能を使って他サーバーに転送する設定を行います。

### 送信側設定
送信側のrsyslogの設定ファイルに転送設定を記述します。

書式：`ログの種類.重要度 @@サーバー名orIPアドレス:ポート番号`

ログの送信プロトコルはUDPとTCPを選択可能です。
下記例はTCPで全てのログ(`*.*`)を転送する場合の設定です。
UDPで送信する場合は@を1個にしてください。
ポート番号のデフォルトは512ですが、任意で決められます。

```送信側/etc/rsyslog.conf
# remote host is: name/ip:port, e.g. 192.168.0.1:514, port optional
*.* @@192.168.242.xxx:514
```

### 受信側設定
転送されたログを受信するサーバー側のrsyslogの設定ファイルに受信設定を記述します。
設定自体は既にコメントアウトされた状態で記述されているので、送信されるプロトコルに応じて、コメントを外すだけでOKです。
下記はTCP受信設定のコメントを外していますが、UDPで受信する場合はUDP受信設定のコメントを外してください。送信設定でポート番号を変更している場合はこちらも修正します。

```受信側/etc/rsyslog.conf
# Provides UDP syslog reception
#$ModLoad imudp
#$UDPServerRun 514

# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514

```

設定が完了したら、送信側と受信側のrsyslogを再起動してください。

```
$ systemctl restart rsyslog
```

なお、firewalldを使用している場合は、受信側ポートの穴あけが必要になります。
参考までにTCPのポート514のポート穴あけをするコマンドは以下の通りです。 [^1]

[^1]: デフォルトでFirewall-cmdで指定できるサービス名として「syslog」がありますが、こちらは514/UDPを開放するサービス名のため、514/TCPを開放するためには`--add-port`でポートを指定する必要があります。

```
$ firewall-cmd --add-port 514/tcp
```


これでシステムログが転送されるようになります。




## ２．Apache httpの送信設定

### 送信側設定
### Apache httpのログをrsyslogに出力させる
Apache httpの設定ファイル(/etc/httpd/conf/hhtp.conf)のログ設定項目に、loggerコマンドを使ってrsyslogに転送するように設定します。 [^2]

[^2]: 正確にはjournald経由でrsyslogでログを書き込む形になります。

Apache httpの設定ファイルを以下のように修正します。

書式：
`CustomLog "|/user/bin/logger -p プロパティ.優先度" combined`
rsyslogはプロパティと優先度で出力先のログを判断するので、他のログと重複しない空いているプロパティ（local0～local6）を割り当てます。


```/etc/httpd/conf/http.conf
CustomLog "|/usr/bin/logger -p local1.info -t http_access" combined
ErrorLog "|/usr/bin/logger -p local1.warn -t http_error"

```

### rsyslogでApache httpのログ出力先ファイルを指定する

Apache httpのログ出力先を指定します。
併せて、Apacheのログが/var/log/messagesに出力しないように設定(`none`)します。

```/etc/rsyslog.conf
# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none;local1.none    /var/log/messages
　　　　　　　　　　　　　　　　　　　　　　　↑追記
## Application Log
local1.=info                         /var/log/httpd/httpd_access.log
local1.=warn                         /var/log/httpd/httpd_error.log
```


### サービスの再起動
設定を反映させるために、サービスの再起動を行います。

```
$ systemctl restart httpd
$ systemctl restart rsyslog
```

これで、送信側のApache httpログが受信側に送られるようになりました。

### 受信側設定
次に受信側でも、Apache httpログの出力設定を追加します。

```/etc/rsyslog.conf
# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none;local1.none    /var/log/messages
　　　　　　　　　　　　　　　　　　　　　　　↑追記
## Application Log
local1.=info                         /var/log/httpd/httpd_access.log
local1.=warn                         /var/log/httpd/httpd_error.log
```

設定を反映させるために、サービスの再起動を行います。

```
$ systemctl restart rsyslog
```

これで、sysylogとApache httpログが他サーバーでログ出力されるようになりました。
なお、SSL通信ログも転送したい場合は、SSL通信の設定ファイル（`/etc/http/conf.d/ssl.conf`）を同様に修正してください。


# おわりに
今回はApache httpを例にしましたが、他ミドルウェアでも大抵rsyslog経由でログを出力する設定があるため、同様に転送を実施することが可能です。ただ、ミドルウェア毎に設定方法が異なるため、注意が必要です。（筆者は、Nginxのerrorログの転送で詰まり中です。）

今回記載したRsyslogの機能を使用した方法以外にも様々なログ転送方法はあるので、勉強してより良い方法を探っていきたいと思います。

以上