UbuntuでRSyslogの設定

Ubuntu 12.04 での RSyslog の設定についてメモ。

Rsyslog とは

syslog のシステム全体図

Michael Kerrisk”The Linux Programming Interface” では Ch 37 : Daemons の §37.5 Logging Messages and Errors Using syslog で昔ながらの syslog が扱われている。ただし rsyslog/syslog-ng への言及はない。

The syslog facility provides a single, centralized logging facility that can be used to log messages by all applications on the system. — The Linux Programming Interface §37.5 Logging Messages and Errors Using syslog

syslog(d) の全体図が綺麗にまとまっているので fig.37-1 を引用。

設定の最終ゴール

rsyslog に対して以下のプロトコルを使ってログ出力する

  • Unix Domain Socket
  • UDP
  • TCP

OS は Ubuntu 12.04 とする。

Ubuntu 固有の環境情報

実行ユーザは root ではなく syslog(RetHat では root)

Ubuntu 12.04 では、設定ファイルは以下のパスにある

  • /etc/rsyslog.conf — main setting
  • /etc/rsyslog.d/20-ufw.conf — setting for ufw 
  • /etc/rsyslog.d/50-default.conf — other settings

ログ出力方法

ログ出力はコマンドラインから行う。logger nc を利用。

  • logger –  a shell command interface to the syslog(3) system log module
  • nc(netcat) – arbitrary TCP and UDP connections and listens($ apt-get install netcat-openbsd でインストール)
    netcat-traditional は利用しない

Unix Domain Socket 向け設定

  • ローカルマシンへの syslog で利用。
  • imuxsock モジュールを利用
  • STREAM ではなく DATAGRAM(unix(7) によると UNIX domain datagram sockets are always reliable and don’t reorder datagrams)

デフォルトで有効になっているので、特別な設定は不要。
ソケットファイルは /dev/log にある

$ ll /dev/log
srw-rw-rw- 1 root root 0 Nov 11 03:04 /dev/log=

パスの末尾が「=」なので、確かに Unix Domain Socket.

$ logger hello from logger
$ logger --socket=/dev/log -d specify socket and connection type
# 出力結果
$ tail -f /var/log/syslog
Nov 17 17:26:05 host1 jsmith: hello from logger
Nov 17 17:27:41 host1 jsmith: specify socket and connection type

netcat でログ出力しようとすると、 udp と unix domain socket のコンボは nc のバグにより実行できない。(“nc: cannot use -u and -U” と怒られる。1.105-7 で修正)

netcat-openbsd: cannot use -u and -U, even though manpage (and the code) says it’s ok
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=676997

本来なら $ nc -uU /dev/log で OK なはず。

UDP/TCP 向け設定

syslog は UDP だけに対応していたのに対して、rsyslog は TCP にも対応しているため、より reliable に通信できる。

  • UDP/TCP 通信を有効にするために /etc/rsyslog.conf を書き換える
  • imudp/imtcp モジュールを有効にし、それぞれのポートを指定する。
    (下の例では、UDPは1514ポート、TCPは2514ポート)
$ diff -u rsyslog.conf rsyslog.conf.orig
--- rsyslog.conf        2012-11-17 17:50:25.790449586 +0900
+++ rsyslog.conf.orig   2012-11-17 17:48:18.846446152 +0900
@@ -15,12 +15,12 @@
 #$ModLoad immark  # provides --MARK-- message capability

 # provides UDP syslog reception
-$ModLoad imudp
-$UDPServerRun 1514
+#$ModLoad imudp
+#$UDPServerRun 514

 # provides TCP syslog reception
-$ModLoad imtcp
-$InputTCPServerRun 2514
+#$ModLoad imtcp
+#$InputTCPServerRun 514
$ sudo service rsyslog  restart
rsyslog stop/waiting
rsyslog start/running, process 17430

注意点としては syslogd はデフォルトで 514 番ポート(Privileged Port)を利用するのに対し、Ubuntu は syslog ユーザで rsyslog を実行しているため、1024 以上のポートを割り振る必要が有ること。(setcap を使うという手もなくはない http://linux.die.net/man/8/setcap)。そのため、モジュールを有効にして、デフォルトのポートのまま起動しても、LISTEN 状態にはならない。

1年以上前に Ubuntu の BTS にバグ報告されているのに、放置されている。コメントの数から類推すると、ハマっている人が結構いる模様。

Bug #789174 : rsyslog fails to create tcp socket.
https://bugs.launchpad.net/ubuntu/+source/rsyslog/+bug/789174

RedHat では root ユーザで実行され、514番ポートに bind される。

UDP 向け設定

$ logger -P 1514 -d syslog via datagram protocol
$ nc -u localhost 1514
nc datagram logging

$ tail -f /var/log/syslog
Nov 17 18:06:05 host1 jsmith: syslog via datagram protocol
Nov 17 18:06:58 nc datagram logging

logger -P オプションはポート、 -d はデフォルトの stream(TCP) ではなく datagram(UDP) を表す
nc-u はデフォルトの stream(TCP) ではなく datagram(UDP) を表す

TCP 向け設定

$ logger -P 2514 syslog via  stream
$ nc localhost 2514
nc stream logging

Nov 17 18:10:14 host1 jsmith: syslog via stream
Nov 17 18:10:43 nc stream logging

logger, nc ともにデフォルトは TCP 通信なので、必要なオプションはミニマム。

他サーバへのリレー
UDP/TCP 通信で syslog を他のサーバにリレーすることもできる。

UDP 転送する場合は @ で、TCP 転送する場合は @@ でリモートホストを指定する。
ポートを省くと、rsyslog デフォルトの 514 番ポートが利用される。

$ diff -u /etc/rsyslog.d/50-default.conf*
--- /etc/rsyslog.d/50-default.conf      2012-11-17 18:16:45.281784029 +0900
+++ /etc/rsyslog.d/50-default.conf.orig 2012-11-17 18:16:05.973781956 +0900
@@ -2,9 +2,6 @@
 #
 #                      For more information see rsyslog.conf(5) and /etc/rsyslog.conf

-*.*   @host1:1514
-*.*   @@host2:2514
-
 #
 # First some standard log files.  Log by facility.
 #
$ logger hello world@host3

@/@@ で指定したリモートサーバの syslog ファイルを確認すると、ログ転送元サーバ(host3) からのメッセージが出力されている。

Nov 17 18:17:01 host3 jsmith: hello world@host3

Books

syslog 系 RFC

  • RFC 3195 Reliable Delivery for syslog
  • RFC 5424 The Syslog Protocol
  • RFC 5425 TLS Transport Mapping for Syslog
  • RFC 5426 Transmission of Syslog Messages over UDP
  • RFC 5427 Textual Conventions for Syslog Management
  • RFC 5848 Signed Syslog Messages
  • RFC 6012 Datagram Transport Layer Security (DTLS) Transport Mapping for Syslog
Advertisements
Tagged with: , , ,
Posted in middleware

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Archives
  • RT @__apf__: How to write a research paper: a guide for software engineers & practitioners. docs.google.com/presentation/d… /cc @inwyrd 6 months ago
  • RT @HayatoChiba: 昔、自然と対話しながら数学に打ち込んだら何かを悟れるのではと思いたち、専門書1つだけ持ってパワースポットで名高い奈良の山奥に1週間籠ったことがある。しかし泊まった民宿にドカベンが全巻揃っていたため、水島新司と対話しただけで1週間過ぎた。 それ… 6 months ago
  • RT @googlecloud: Ever wonder what underwater fiber optic internet cables look like? Look no further than this deep dive w/ @NatAndLo: https… 6 months ago
  • @ijin UTC+01:00 な時間帯で生活しています、、、 1 year ago
  • RT @mattcutts: Google's world-class Site Reliability Engineering team wrote a new book: amazon.com/Site-Reliabili… It's about managing produc… 1 year ago
%d bloggers like this: