syslog-ng-1.6.11

  Unix

ただ Syslog 出すだけなら、標準の syslogd でいいんだけども、Syslog サーバーを作るなら、syslog-ng で。

Sun Studio 11 だとコンパイルできなぁ。gcc で。あとデフォルトだとスタティックリンクになっちゃんだけども、Solaris はなぜか、スタティックリンク用のライブラリ(libl.a, libwrap.a とか)がなくてコンパイルできんのですわ。ダイナミックリンクで対応する必要あり。
あと、要るか要らんか今のところわからんが、TCP Wrapper も組み込んでおく。

cd src/
wget http://www.balabit.com/downloads/syslog-ng/1.6/src/syslog-ng-1.6.11.tar.gz
gtar zxf syslog-ng-1.6.11.tar.gz
cd syslog-ng-1.6.11/
export CC=/usr/sfw/bin/gcc CXX=/usr/sfw/bin/g++
./configure --prefix=/usr/local/syslog-ng-1.6.11 --enable-tcp-wrapper --enable-full-dynamic
make
sudo make install

コンフィグ syslog-ng.conf をぶっこむ。

sudo mkdir -p /usr/local/syslog-ng-1.6.11/etc/syslog-ng
sudo cp contrib/syslog-ng.conf.SunOS /usr/local/syslog-ng-1.6.11/etc/syslog-ng/syslog-ng.conf
cd /usr/local/
sudo ln -s syslog-ng-1.6.11 syslog-ng

SMF 用のマニフェストを書く。(パーミッションは 444, オーナーは root:sys)

/var/svc/manifest/system/syslog-ng.xml

<?xml version='1.0'?>
<!DOCTYPE service_bundle SYSTEM '/usr/share/lib/xml/dtd/service_bundle.dtd.1'>
<service_bundle type='manifest' name='syslog-ng'>
<service name='system/syslog-ng' type='service' version='0'>
<create_default_instance enabled='false'/>
<single_instance/>
<dependency name='milestone' grouping='require_all' restart_on='none' type='service'>
<service_fmri value='svc:/milestone/single-user'/>
</dependency>
<dependency name='filesystem' grouping='require_all' restart_on='none' type='service'>
<service_fmri value='svc:/system/filesystem/local'/>
</dependency>
<dependent name='syslog-ng_single-user' restart_on='none' grouping='optional_all'>
<service_fmri value='svc:/milestone/multi-user'/>
</dependent>
<exec_method name='start' type='method' exec='/lib/svc/method/syslog-ng' timeout_seconds='600'>
<method_context/>
</exec_method>
<exec_method name='stop' type='method' exec=':kill' timeout_seconds='60'>
<method_context/>
</exec_method>
<exec_method name='refresh' type='method' exec=':kill -HUP' timeout_seconds='60'>
<method_context/>
</exec_method>
<property_group name='general' type='framework'>
<propval name='action_authorization' type='astring' value='solaris.smf.manage.syslog-ng'/>
</property_group>
<stability value='Unstable'/>
<template>
<common_name>
<loctext xml:lang='C'>syslog-ng</loctext>
</common_name>
<documentation>
<manpage title='syslog-ng' section='1M' manpath='/usr/local/syslog-ng/man'/>
</documentation>
</template>
</service>
</service_bundle>

SMF 用の起動スクリプトを書く。(パーミッションは 555, オーナーは root:bin)

/lib/svc/method/syslog-ng

#!/sbin/sh

. /lib/svc/share/smf_include.sh

if [ -f /usr/local/syslog-ng/etc/syslog-ng/syslog-ng.conf \
-a -f /usr/local/syslog-ng/sbin/syslog-ng ]; then
echo 'syslog service starting.'
if [ "${_INIT_ZONENAME:=`/sbin/zonename`}" = "global" ]; then
#
# Before syslogd starts, save any messages from
# previous crash dumps so that messages appear
# in chronological order.
#
/usr/bin/savecore -m
if [ -r /etc/dumpadm.conf ]; then
. /etc/dumpadm.conf
[ -n "$DUMPADM_DEVICE" -a \
"x$DUMPADM_DEVICE" != xswap ] && \
/usr/bin/savecore -m -f $DUMPADM_DEVICE
fi
fi
if [ ! -f /var/adm/messages ]; then
/usr/bin/cp /dev/null /var/adm/messages
/usr/bin/chmod 0644 /var/adm/messages
fi
/usr/local/syslog-ng/sbin/syslog-ng >/dev/msglog 2>&1 &
else
exit $SMF_EXIT_ERR_CONFIG
fi

SMF に登録して、自動起動するようにしておく。代わりに syslogd は止める。

svccfg import /var/svc/manifest/system/syslog-ng.xml
svcadm disable system-log
svcadm enable syslog-ng

Syslog サーバーとして外から Syslog を受け取るときは、以下をコンフィグに追加して 514/udp ポートを開く。(TCP でも受けれるらしいよ)

source s_udp { udp(); };

ぼく的には、最初はフィルタするっていようよりも、とりあえず全部出すってのが好きだから、こんなコンフィグを入れてみる。
(mkdir /var/syslog-ng が必要)

destination d_all { file("/var/syslog-ng/syslog"); };
log { source(s_sys); source(s_udp); destination(d_all); };

コンフィグ更新後の再読み込みは、SMF で楽チンにできる。

sudo /usr/sbin/svcadm refresh syslog-ng

ちなみにここで作った SMF 用のマニフェストは、syslog-log をベースに作った。

svccfg export system-log > syslog-ng.xml