FreeBSD 10 に syslog-ng を導入してみた

この記事を読むのに必要な時間は約 27 分です。


FreeBSD 10 に syslog の次世代版である syslog-ng を導入した際の作業メモです。

急ぎで作業しているため、正しくないところもあるかも知れません…。とりあえず最低限動作するかな、というレベルですが、忘れてしまわぬうちに残しておきたいと思います。


logo-FreeBSD

 

やりたいこと

syslog の集中管理を行うために、転送元による振り分けを行えるようにしたいです。

転送元は、ルーター と、無線 LAN 親機の 2台です。今のところ。今後増えるかも知れないですし、syslog 管理に慣れてみたいといった感じです。

環境

OS のバージョンは、FreeBSD 10.1-RELEASE です。

旧 syslog の問題点や、syslog-ng の利点、他選択肢となる rsyslog との違いなどは @IT にまとまっています

2008年と古めになりますが、 こちらの @IT の記事 がよくまとまっているようですので、そちらを読んでいただければ、概要が分かりやすいかと思います。

syslog-ng について

syslog-ng 公式サイト (英語) を見ると、Open Source 版と、Premium 版と、仮想VM用のアプライアンス版とがありそうです。

違いなどは見ていませんが、お金かける気もありませんので、FreeBSD の pkg で用意されているものを利用したいと思います。

とりあえずインストールしてみる

何はともあれ、pkg を探してみます。

user@host:~ $ sudo su -
root@host:~ # pkg search syslog
erlang-lager_syslog-2.1.2
erlang-syslog-1.0.3
fpc-syslog-2.6.4_1
minirsyslogd-1.02
msyslog-1.08g_3
p5-Log-Any-Adapter-Syslog-1.5_2
p5-Net-Syslog-0.04_1
p5-Parse-Syslog-1.10_1
p5-Parse-Syslog-Mail-0.17_1
p5-Sys-Syslog-0.33_1
p5-SyslogScan-0.32_2
p5-Tie-Syslog-2.04.03_1
p5-Unix-Syslog-1.1_1
razorback-syslogNugget-0.5.0_2
rsyslog-7.6.7_1
rsyslog8-8.11.0
rubygem-SyslogLogger-2.0
syslog-ng-3.6.4
syslog-ng-devel-3.7.0a2_1
syslog-ng-incubator-0.4.1_1
syslog-ng-incubator03-0.3.3_1
syslog-ng33-3.3.11_6
syslog-ng34-3.4.8_9
syslog-ng35-3.5.6_6
syslogger-1.0
tclsyslog-2.1_1

というわけで、標準では syslog-ng-3.6.4 がインストールされるようです。インストールしてみます。

root@tools01:~ # pkg install syslog-ng
Updating FreeBSD repository catalogue...
FreeBSD repository is up-to-date.
All repositories are up-to-date.
The following 8 package(s) will be affected (of 0 checked):

New packages to be INSTALLED:
	syslog-ng: 3.6.4
	eventlog: 0.2.12_1
	openssl: 1.0.2_4
	json-c: 0.12_2
	glib: 2.44.1_1
	python27: 2.7.10
	libffi: 3.2.1
	libiconv: 1.14_8

The process will require 100 MiB more space.
17 MiB to be downloaded.

Proceed with this action? [y/N]: y
Fetching syslog-ng-3.6.4.txz: 100%  549 KiB 561.8kB/s    00:01    
Fetching eventlog-0.2.12_1.txz: 100%   14 KiB  14.6kB/s    00:01    
Fetching openssl-1.0.2_4.txz: 100%    3 MiB 482.4kB/s    00:06    
Fetching json-c-0.12_2.txz: 100%   38 KiB  38.7kB/s    00:01    
Fetching glib-2.44.1_1.txz: 100%    3 MiB 455.5kB/s    00:06    
Fetching python27-2.7.10.txz: 100%   10 MiB 505.4kB/s    00:21    
Fetching libffi-3.2.1.txz: 100%   35 KiB  36.2kB/s    00:01    
Fetching libiconv-1.14_8.txz: 100%  592 KiB 605.8kB/s    00:01    
Checking integrity... done (0 conflicting)
[1/8] Installing libffi-3.2.1...
[1/8] Extracting libffi-3.2.1: 100%
[2/8] Installing python27-2.7.10...
[2/8] Extracting python27-2.7.10: 100%
[3/8] Installing libiconv-1.14_8...
[3/8] Extracting libiconv-1.14_8: 100%
[4/8] Installing eventlog-0.2.12_1...
[4/8] Extracting eventlog-0.2.12_1: 100%
[5/8] Installing openssl-1.0.2_4...
[5/8] Extracting openssl-1.0.2_4: 100%
[6/8] Installing json-c-0.12_2...
[6/8] Extracting json-c-0.12_2: 100%
[7/8] Installing glib-2.44.1_1...
[7/8] Extracting glib-2.44.1_1: 100%
スキーマファイルが見つかりません: 何もしません。
[8/8] Installing syslog-ng-3.6.4...
[8/8] Extracting syslog-ng-3.6.4: 100%
Message for python27-2.7.10:
=====================================================================

Note that some standard Python modules are provided as separate ports
as they require additional dependencies. They are available as:

bsddb           databases/py-bsddb
gdbm            databases/py-gdbm
sqlite3         databases/py-sqlite3
tkinter         x11-toolkits/py-tkinter

=====================================================================
Message for openssl-1.0.2_4:
Copy /usr/local/openssl/openssl.cnf.sample to /usr/local/openssl/openssl.cnf
and edit it to fit your needs.
Message for syslog-ng-3.6.4:
syslog-ng is now installed!  To replace FreeBSD's standard syslogd
(/usr/sbin/syslogd), complete these steps:

1. Create a configuration file named /usr/local/etc/syslog-ng.conf
   (a sample named syslog-ng.conf.sample has been included in
   /usr/local/etc). Note that this is a change in 2.0.2
   version, previous ones put the config file in
   /usr/local/etc/syslog-ng/syslog-ng.conf, so if this is an update
   move that file in the right place

2. Configure syslog-ng to start automatically by adding the following
   to /etc/rc.conf:

        syslog_ng_enable="YES"

3. Prevent the standard FreeBSD syslogd from starting automatically by
   adding a line to the end of your /etc/rc.conf file that reads:

        syslogd_enable="NO"
 
4. Shut down the standard FreeBSD syslogd:

     kill `cat /var/run/syslog.pid`

5. Start syslog-ng:

     /usr/local/etc/rc.d/syslog-ng start

最近 update していなかったので、余計なものもついでに update されているかも知れません。

いくつかメッセージが出ています。python と openssl のメッセージは、今は関係ないのでスルーします。

syslog-ng に関して見ていきます。

syslog-ng (3.6.4) pkg インストール時のメッセージ

Message for syslog-ng-3.6.4:
syslog-ng is now installed!  To replace FreeBSD's standard syslogd
(/usr/sbin/syslogd), complete these steps:

syslog-ng インストールしたよ!

FreeBSD 標準の syslogd ( /usr/sbin/syslogd ) を置き換えるためには、以下のステップを実施してね!

 

5 ステップあるようですので、順に見ていきます。

1. Create a configuration file named /usr/local/etc/syslog-ng.conf
   (a sample named syslog-ng.conf.sample has been included in
   /usr/local/etc). Note that this is a change in 2.0.2
   version, previous ones put the config file in
   /usr/local/etc/syslog-ng/syslog-ng.conf, so if this is an update
   move that file in the right place

設定ファイル /usr/local/etc/syslog-ng.conf をつくってね!サンプルは /usr/local/etc/syslog-ng.conf.sample だよ!

syslog-ng v2.0.2 から配置場所が変わったから気をつけてね!前は、/usr/local/etc/syslog-ng/syslog-ng.conf だったよ!

バージョンアップした場合は、新しい場所に配置しなおしてね!

新規インストールなので、以前のことは気にせず、/usr/local/etc/syslog-ng.conf を編集すればよさそうです。

以降のステップに進む前に編集を済ませておくと良さそうです。と言いつつ、編集については、次の項で扱います。

 

以降のステップは、準備が完了してから実際に syslogd を止めて、syslog-ng を起動する作業になっています。

2. Configure syslog-ng to start automatically by adding the following
   to /etc/rc.conf:
        syslog_ng_enable="YES"

syslog-ng が起動時に自動実行されるように、/etc/rc.conf に以下を追記してね!

syslg_ng_enable=”YES”

おっしゃる通り /etc/rc.conf に追記致しましょう。

 

3. Prevent the standard FreeBSD syslogd from starting automatically by
   adding a line to the end of your /etc/rc.conf file that reads:
        syslogd_enable="NO"

FreeBSD 標準の古い syslogd が起動時に自動実行されないように、以下を/etc/rc.conf に追記してね!

syslogd_enable=”NO”

これも言われるがままに追記致しましょう。

 

4. Shut down the standard FreeBSD syslogd:
     kill `cat /var/run/syslog.pid`

(多分 FreeBSD 標準の古い syslogd が稼働中だから) syslogd を以下のコマンドでシャットダウンしてね!

kill `cat /var/run/syslogd.pid`

多分 ステップ 3 で、syslogd を利用しないようにしたため、/etc/rc.d/syslogd が使えないので、直接 kill しているようですね。

/etc/rc.d/syslogd stop してから、ステップ 3 の追記をしても良いかと思います。実際の処理は変わらないかと思いますが。

 

5. Start syslog-ng:
     /usr/local/etc/rc.d/syslog-ng start

/usr/local/etc/rc.d/syslog-ng start で syslog-ng を開始してね!

準備が終わっていれば、開始しましょう。

 

設定ファイルの編集

インストールすると、デフォルトで、標準の syslogd 同等の設定は済んでいるようですので、必要な分だけ追記すれば良いはずです。

 

改めて、今回やりたいことは以下の通りです。

ルーター (xxx.xxx.xxx.1) からのログを /var/log/router.log に振り分けたい。

無線親機 (xxx.xxx.xxx.90) からのログを /var/log/wifi.log に振り分けたい。

ルーターや無線親機は、細かい設定はできないため、旧来の syslog のように、UDP 514番ポートに syslog を垂れ流してきます。

 

設定の流れ

syslog-ng では、プログラムのような感じの設定になっています。

設定の流れをざっくり言えば、以下を定義します。

  • option : syslog-ng 全体の動作についての設定
  • source : ログ発生源の定義。internal、udp、tcp などなど。
  • destination : ログの出力方法の定義。ファイル、転送先、転送先プログラムなどなど。
  • filter : ログをフィルターするルール。facility、host、正規表現 などなど。
  • log : 上記 3つの組合せを定義。オプションで final、fallback など指定可能。

実際にログを出力するのは、log() の定義に従って行われ、log() の中で指定された source、filter、destination が参照されて動作する感じのイメージっぽいです。

 

option の指定

syslog-ng の全体的な動作を option で指定できるようです。

デフォルトは以下の通りです。

options { chain_hostnames(off); flush_lines(0); threaded(yes); };

こう変えました。

options { use_dns(no); keep_hostname(yes); chain_hostnames(off); flush_lines(0); threaded(yes); };

先頭の 2 つを追加しています。

DNS を使わない設定と、host 名が送られてきていればそれを使う設定のようです。

source の指定

source については、デフォルトで以下が定義されています。

source src { system(); udp(); internal(); };

“source” が source の定義だよ、という合図です。”src” が 識別子 で後で参照する際に使います。

“udp()” が指定されているので、udp 514番 で転送されてきた syslog は拾ってくれそうです。しかし、他の log エントリで拾われてしまうため、転送された syslog は分けるよう、以下のように変更しました。

source src { system(); internal(); };
source remote { udp(); tcp(); };

Destination の指定

Destination の設定では、以下の 2行を追加しました。位置は、各種 Destination の定義の最後、Filter の定義の前です。

destination d_router { file("/var/log/router.log"); };
destination d_wifi { file("/var/log/wifi.log"); };
destination d_remote { file("/var/log/remote.log"); };

d_remote はその他用に一応用意しておきます。

ディレクトリを掘る場合は、ディレクトリを作成しておくことをお忘れなく。

Filter の設定

Filter として以下の 2行を追加しました。位置は、各種 Filter 定義の最後、log の定義が始まる前の位置です。

filter f_router { host("192.168.0.1") or host("router"); };
filter f_router_not {  not( host("192.168.0.1") or host("router") );  };
filter f_wifi { host("192.168.0.90") or host("wifi"); };
filter f_wifi_not {  not( host("192.168.0.90") or host("wifi") ); } ;

 

ちょっとややこしくなっていますね …。not を定義したのは、router や wifi をその他用のログで再度拾わないためのものです。

もっとスマートな定義の仕方がありそうですが、とりあえずは力技です。

IP アドレスの指定方法があっているかどうか分かりません…。時間がある時に keep_hostname(no) にすれば多分 host名なしになると思うので、その設定で試してみたいところです。

 

log の設定

以下 2行を追加しました。位置は、log の定義が始まる前に配置しました。

log { source(remote); filter(f_router); destination(d_router); };
log { source(remote); filter(f_wifi); destination(d_wifi); };
log { source(remote); filter(f_router_not); filter(f_wifi_not); destination(d_remote); };

filter は複数設定すると、AND 結合になります。router でも wifi でもない、remote のみ d_remote で出力という設定です。

syslog-ng 再起動

/usr/local/etc/rc.d/syslg-ng restart

reload でも可能ですが、restart の場合、設定ファイルにエラーがあればエラー内容を教えてくれるようです。reload の場合は、/var/log/messages に Parse Error あり、と出力されるだけっぽいです。どこかに出力されているのかも知れませんが、restart であれば、直接画面で見れるので分かりやすいかと思います。

 

ログローテーションの設定

syslog-ng であれば、Destination の設定で日時をつけたファイル名を指定することができ、ログローテーションしなくても良いという話もあります。

しかし、圧縮したり古いものは削除したりまでは、多分面倒みてくれないでしょうから、これまで通りの newsyslog.conf への追加設定で、ログローテションは行いたいと思います。

正直合っているか分からないですが、以下 3行を /etc/newsyslog.conf の先頭に追加しました。

/var/log/router.log     644  7     1024 @T00  J
/var/log/wifi.log     644  7     1024 @T00  J
/var/log/remote.log     644  7     1024 @T00  J

多分それぞれこんな感じの指定です。

  • “/var/log/xxx.log” : ファイルパス
  • “644” : 属性値
  • “7” : 世代数
  • “1024” : バイト数 (1024KB でローテーション)
  • “@T00” : 毎日 0時で強制ローテーション
  • “J” : bzip2 圧縮

ひとこと

とりあえずこんな感じで、動作してくれ始めたようです。

syslog-ng は、他にもたくさんの指定項目、指定方法があり、非常に柔軟に使えるようです。

@IT のこちらの記事 などが、結構分かりやすいかと思いますので、ご参考にどうぞ。

ドキュメントとしては、プレミアム版のドキュメントが公式サイト内 (英語) にあるようです。オープンソースでは使えない機能についてもあるかも知れませんが、共通している部分も非常に多いはずですので、参考になるかと思います。


今回は以上です。


[pn-ad-log-manage]

 

 

 

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です