はじめに
CentOSはrsyslogを使用してログを他サーバーに転送する機能があります。
こちらの機能を使って、他サーバーにシステムログとApache httpのログを転送する方法をまとめました。
前提条件
送信側、受信側共にCentOS7.6環境を使用しています。
Apache httpはyumでインストールしています。バイナリーからインストールした場合は、パスが異なる場合がありますのでご注意ください。
実施内容
システムログを他サーバーに転送するための設定とApache httpのログを転送するための設定の2つに分けて説明していきます。
1.システムログを他サーバーへ転送する設定
rsyslogの転送機能を使って他サーバーに転送する設定を行います。
送信側設定
送信側のrsyslogの設定ファイルに転送設定を記述します。
書式:ログの種類.重要度 @@サーバー名orIPアドレス:ポート番号
ログの送信プロトコルはUDPとTCPを選択可能です。
下記例はTCPで全てのログ(*.*
)を転送する場合の設定です。
UDPで送信する場合は@を1個にしてください。
ポート番号のデフォルトは512ですが、任意で決められます。
# 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受信設定のコメントを外してください。送信設定でポート番号を変更している場合はこちらも修正します。
# Provides UDP syslog reception
#$ModLoad imudp
#$UDPServerRun 514
# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514
設定が完了したら、送信側と受信側のrsyslogを再起動してください。
$ systemctl restart rsyslog
なお、firewalldを使用している場合は、受信側ポートの穴あけが必要になります。
参考までにTCPのポート514のポート穴あけをするコマンドは以下の通りです。 1
$ firewall-cmd --add-port 514/tcp
これでシステムログが転送されるようになります。
2.Apache httpの送信設定
送信側設定
Apache httpのログをrsyslogに出力させる
Apache httpの設定ファイル(/etc/httpd/conf/hhtp.conf)のログ設定項目に、loggerコマンドを使ってrsyslogに転送するように設定します。 2
Apache httpの設定ファイルを以下のように修正します。
書式:
CustomLog "|/user/bin/logger -p プロパティ.優先度" combined
rsyslogはプロパティと優先度で出力先のログを判断するので、他のログと重複しない空いているプロパティ(local0~local6)を割り当てます。
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
)します。
# 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ログの出力設定を追加します。
# 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の機能を使用した方法以外にも様々なログ転送方法はあるので、勉強してより良い方法を探っていきたいと思います。
以上