この記事を読むのに必要な時間は約 27 分です。
FreeBSD 10 に syslog の次世代版である syslog-ng を導入した際の作業メモです。
急ぎで作業しているため、正しくないところもあるかも知れません…。とりあえず最低限動作するかな、というレベルですが、忘れてしまわぬうちに残しておきたいと思います。
やりたいこと
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]