@uzyexe のノート

ITインフラ運用系のネタを主に書く、つもり・・・

nxlogを使ったsyslogメッセージの複製転送

以前からサーバやネットワーク機器のログ監視のために下図のようにしてsyslog-ngを使っていた。これは機器から送信されてくるsyslogをsyslog-ngで受け取って、syslog-ngの設定にもとづいてログを記録したり、クリティカルなアラートをスクリプトでメール送信処理したりするシンプルかつ伝統的なsyslog監視サーバだ。この構成ではどのようなログが流れているかをリアルタイムで確認するためにはサーバにログインして、tail -fするしかなかった。

■ 旧構成図

f:id:uzy_exe:20131228025527p:plain

そこでLogStashを導入したくなった。今回の本題はnxlogなのでLogStashの導入手順についてはここでは詳しく説明しない。

 

LogStashはログの世界でいうところのShipperやIndexerの役割を担当するツール。一般的には、下図のようにElastic Searchをバックエンド部分に使い、KibanaをWeb UIとして連携させることでログの可視化を実現するために使われる。国内だと最近はfluentdに押され気味な気がする。

■ LogStashの一般的な構成例

f:id:uzy_exe:20131228025557p:plain

 

LogStashの導入にあたって、すでにsyslog設定済みであるサーバやネットワーク機器の設定になるべく手を加えたくなかった。なので、ここでnxlogを使って下図のように移行した。

■ 新構成図

f:id:uzy_exe:20131228025626p:plain

 nxlogはログのShipper(中継エージェント)兼 Broker(バッファリングサーバ)として働く。その機能を利用して、機器から送信されてくるsyslogをsyslog-ngとLogStashに複製転送することにした。おかげで、既存の構成に大きく手を加えずにLogStashを追加することができるようになった。

 

RHEL系OSの場合、nxlogのインストールは以下の手順を実行するだけ。(debianubuntuの場合も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>

    Path        in_udp => out_tcp

</Route>

 

# syslog-ng route is,

<Route syslog-ng>

    Path        in_udp => out_udp

</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は十分にシンプルで実用的なツールだと思う。