読者です 読者をやめる 読者になる 読者になる

opamp_sando's blog

クソザコが割りと適当なことを書くためにある備忘録です。あとたまに普通の日記も書きます

syslog-ngを触ってみた

最近rsyslogの調子が悪くて、どうもsocketを利用して入ってくるはずのログが取れないという症状に見舞われて解決策がわからない上に同じようなことになってる人も見当たらずに困っていたので、試しにsyslog-ngに乗り換えてみた。
正直こだわりはあんまりないのでログが取れればよいのです。

$ (sudo) pacman -S syslog-ng

とりあえずバイナリパッケージをインストール。
syslog-ngの設定ファイルは(archなら)/etc/syslog-ng/syslog-ng.confにあるようだ。

ぱっと見た感じ結構わかりやすい。互換を捨てただけのことはある。
某団体所有のESXi上で動いてるArchLinuxの設定ファイルの例。
本当に1,2日前に使い始めたばかりなので全然凝った設定はできていないが...

@version: 3.5
@include "scl.conf"
#
# /etc/syslog-ng/syslog-ng.conf
#

options {
  stats (43200);
  sync (0);
  stats_freq (0);
  flush_lines (0);
  time_reopen (10);
  log_fifo_size (10000);
  chain_hostnames (off);
  ts_format (iso);
  use_dns (no);
  use_fqdn (no);
  create_dirs (yes);
  keep_hostname (yes);
  perm(0640);
  dir_perm(0755);
  owner("root");
  group("log");
};

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

destination d_default  { file("/var/log/syslog-ng/${FACILITY}/$YEAR/$MONTH/$DAY.log"); };
destination d_level    { file("/var/log/syslog-ng/${PRIORITY}/$YEAR/$MONTH/$DAY.log"); };
destination d_message  { file("/var/log/syslog-ng/message/$YEAR/$MONTH/$DAY.log"); };
destination d_iptables { file("/var/log/syslog-ng/iptables/$YEAR/$MONTH/$DAY.log"); };
destination d_console  { usertty("root"); };

# Log everything to tty12
destination console_all { file("/dev/tty12"); };

filter f_auth { facility(auth); };
filter f_authpriv { facility(auth, authpriv); };
filter f_syslog { program(syslog-ng); };
filter f_cron { facility(cron); };
filter f_daemon { facility(daemon); };
filter f_kernel { facility(kern) and not filter(f_iptables); };
filter f_lpr { facility(lpr); };
filter f_mail { facility(mail); };
filter f_news { facility(news); };
filter f_user { facility(user); };
filter f_uucp { facility(uucp); };
filter f_ppp { facility(local2); };
filter f_debug { not facility(auth, authpriv, news, mail); };
filter f_messages { level(info..warn) and not facility(auth, authpriv, mail, news, cron) and not program(syslog-ng) and not filter(f_iptables); };
filter f_everything { level(debug..emerg) and not facility(auth, authpriv); };
filter f_emergency { level(emerg); };
filter f_info { level(info); };
filter f_notice { level(notice); };
filter f_warn { level(warn); };
filter f_crit { level(crit); };
filter f_err { level(err); };
filter f_iptables { match("IN=" value("MESSAGE")) and match("OUT=" value("MESSAGE")); };
filter f_acpid { program("acpid"); };
# local0 ~ 7
filter f_local0 { facility(local0); };
filter f_local1 { facility(local0); };
filter f_local2 { facility(local0); };
filter f_local3 { facility(local0); };
filter f_local4 { facility(local0); };
filter f_local5 { facility(local0); };
filter f_local6 { facility(local0); };
filter f_local7 { facility(local0); };

log { source(src); filter(f_acpid); destination(d_default); };
log { source(src); filter(f_authpriv); destination(d_default); };
log { source(src); filter(f_syslog); destination(d_default); };
log { source(src); filter(f_cron); destination(d_default); };
log { source(src); filter(f_daemon); destination(d_default); };
log { source(src); filter(f_kernel); destination(d_default); };
log { source(src); filter(f_lpr); destination(d_default); };
log { source(src); filter(f_mail); destination(d_default); };
log { source(src); filter(f_news); destination(d_default); };
log { source(src); filter(f_ppp); destination(d_default); };
log { source(src); filter(f_user); destination(d_default); };
log { source(src); filter(f_uucp); destination(d_default); };
log { source(src); filter(f_messages); destination(d_message); };
log { source(src); filter(f_err); destination(d_level); };
log { source(src); filter(f_emergency); destination(d_level); };
log { source(src); filter(f_everything); destination(d_level); };
log { source(src); filter(f_iptables); destination(d_iptables); };
log { source(src); filter(f_local0); destination(d_default); };
log { source(src); filter(f_local1); destination(d_default); };
log { source(src); filter(f_local2); destination(d_default); };
log { source(src); filter(f_local3); destination(d_default); };
log { source(src); filter(f_local4); destination(d_default); };
log { source(src); filter(f_local5); destination(d_default); };
log { source(src); filter(f_local6); destination(d_default); };
log { source(src); filter(f_local7); destination(d_default); };

# Log everything to tty12
#log { source(src); destination(console_all); };

source, destination, filterを定義して、最後に"log"を使って実際にログを書き出す設定をしている。

log { source ; filter ; destination };

というように設定すれば、定義したsourceからログを拾ってきてfilterで必要なものだけ抜き取ってdestinationで指定した先に書き出すということができるようだ。

設定ファイルがすごく見やすいので、あんまりググらなくても上の設定くらいなら初期設定ファイルをちょっと書き換えるだけで作れてしまった。
ググったことといえば、destinationでFACILITYなんかを使いたいときの変数名と、optionsで指定するいくつかのoptionのおすすめ設定くらいかな?
今のところ、他サーバーにログを投げたりしないので、TCPUDPを使う必要もないしこのくらいで割と十分だったりする。というかこのサーバーは練習&実験用なので...

なお、うまいことrsyslogを置き換えれそうなので、VPSのArchなんかもすでに移行しました。

VPSは結構ログの容量がえらいことになりがちなので、cronか何かで定期的に走って圧縮をかけるスクリプトか何か書かないといけないな...

Firefox ブラウザ無料ダウンロード