Posted at

CentOS7のログ転送設定


はじめに

CentOSはrsyslogを使用してログを他サーバーに転送する機能があります。

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


前提条件

送信側、受信側共にCentOS7.6環境を使用しています。

Apache httpはyumでインストールしています。バイナリーからインストールした場合は、パスが異なる場合がありますのでご注意ください。


実施内容

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


1.システムログを他サーバーへ転送する設定

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

$ 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)を割り当てます。


/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の機能を使用した方法以外にも様々なログ転送方法はあるので、勉強してより良い方法を探っていきたいと思います。

以上





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



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