nxlogを使ったsyslogメッセージの複製転送
以前からサーバやネットワーク機器のログ監視のために下図のようにしてsyslog-ngを使っていた。これは機器から送信されてくるsyslogをsyslog-ngで受け取って、syslog-ngの設定にもとづいてログを記録したり、クリティカルなアラートをスクリプトでメール送信処理したりするシンプルかつ伝統的なsyslog監視サーバだ。この構成ではどのようなログが流れているかをリアルタイムで確認するためにはサーバにログインして、tail -fするしかなかった。
■ 旧構成図
そこでLogStashを導入したくなった。今回の本題はnxlogなのでLogStashの導入手順についてはここでは詳しく説明しない。
LogStashはログの世界でいうところのShipperやIndexerの役割を担当するツール。一般的には、下図のようにElastic Searchをバックエンド部分に使い、KibanaをWeb UIとして連携させることでログの可視化を実現するために使われる。国内だと最近はfluentdに押され気味な気がする。
■ LogStashの一般的な構成例
LogStashの導入にあたって、すでにsyslog設定済みであるサーバやネットワーク機器の設定になるべく手を加えたくなかった。なので、ここでnxlogを使って下図のように移行した。
■ 新構成図
nxlogはログのShipper(中継エージェント)兼 Broker(バッファリングサーバ)として働く。その機能を利用して、機器から送信されてくるsyslogをsyslog-ngとLogStashに複製転送することにした。おかげで、既存の構成に大きく手を加えずにLogStashを追加することができるようになった。
RHEL系OSの場合、nxlogのインストールは以下の手順を実行するだけ。(debianやubuntuの場合もdpkg -iでパッケージをインストールするだけのはず。)
nxlogの最新パッケージとソースはSource Forgeからダウンロードできる。
yum install libdbi dialog
rpm -ivh http://jaist.dl.sourceforge.net/project/nxlog-ce/nxlog-ce-2.6.1131-1.x86_64.rpm
nxlogの設定ファイルは以下のように設定した。
■ nxlog.conf
########################################
# Global directives #
########################################
#User nxlog
#Group nxlog
LogFile /var/log/nxlog/nxlog.log
LogLevel INFO
########################################
# Modules #
########################################
# NXlog syslog extension activation (needed to receive syslog messages)
<Extension _syslog>
Module xm_syslog
</Extension>
# NXlog JSON extension activation (needed to forward messages to Logstash)
<Extension json>
Module xm_json
</Extension>
# NXlog input to receive UDP syslog messages on standard UDP port.
<Input in_udp>
Module im_udp
Host 0.0.0.0
Port 514
</Input>
# NXlog output to send TCP syslog messages for 5514 custam TCP port.
# Note the parse syslog input to json exec.
<Output out_tcp>
Module om_tcp
Port 5514
Host logstash-server
Exec parse_syslog(); to_json();
</Output>
# NXlog output to send UDP syslog messages for 5514 custam UDP port.
# Note the parse syslog input to syslog_ietf exec.
<Output out_udp>
Module om_udp
Port 5514
Host syslog-ng-server
Exec parse_syslog(); to_syslog_ietf();
</Output>
########################################
# Routes #
########################################
# logstash route is,
<Route logstash>
</Route>
# syslog-ng route is,
<Route syslog-ng>
</Route>
nxlogのバッファサイズをカスタマイズする場合、以下のような感じの設定をnxlog.confに追記してやるとよい。
########################################
# Processor #
########################################
# logstash buffer is,
<Processor buffer_logstash>
Module pm_buffer
# 1Mb buffer
MaxSize 1024
Type Mem
# warn at 512k
WarnLimit 256
</Processor>
その場合、<Route logstash>内のPath行の定義も、以下のように修正を加える。
# logstash route is,
<Route logstash>
Path in_udp => buffer_logstash => out_tcp
</Route>
前述したとおり、fluentdという選択肢もあるが、syslogくらいしか扱ってない環境においてnxlogは十分にシンプルで実用的なツールだと思う。