Last Update: "2014/07/09 11:49:04 makoto"
記録
syslog.conf の書き方
【/etc/syslog.conf の設定】
Unix の機械では Daemon と呼ばれる様々な機能(処理)が実行されています。
それらの処理から、状態とか問題などの何かの記録を残す時の仕掛が syslog です。
その syslog 自体も daemon の一つですが、それは別として、
syslogd が、記録を残す時にまとめて面倒を見ます。この syslogd の動作については /etc/syslog.conf に設定します。
google 検索 →
syslog.conf の書き方
(以下の記述は man syslog.conf を参考に書いています)
/etc/syslog.conf の
中に書く設定は 「分類しておいて、それに対して、どう記録するか」という方法です。具体的には、一行毎に
「selector(分類) → action(記録方法)」の形をしています。
そのうちの矢印の左側の selector は facility.level の形をしています。つまり
syslog.conf の各行は、次のような形式です。
facility.level | (TAB) | 表示先 |
(selector) | → | (action) |
左側の facility.level に一致したものが、その右側に書いてある
「表示先」に出ます。
左側には facility.level と書いてありますが、そのうち
.level の部分は省略出来ます。また複数の selector を セミコロン
(;) でつないで、まとめて同じ表示先に出すという書き方も可能です。
/etc/syslog.conf を見ると、(注釈でない)有効な一行目は次のように書いてあるはずです。
*.err;kern.*;auth.notice;authpriv.none;mail.crit
1 2 3 4
| (TAB) | /dev/console |
(selector) | → | (action) |
ここで数字はセミコロンを数えています。
セミコロンが四つあるので、「全部で五つをまとめて、/dev/console に出すという」意味になります。
このように並べる時には、順序も重要で、後の方に書いたものが優先します。
そこで、初めに一般的なものを、後に特例 (specific) を書きます。
これらの説明は英語になりますが、man syslog.conf で見られます。
上には authprov.none という字もありますが、この .none はちょっと特殊です。
これは後の【level】で説明します。
selector と action
用語のその一として、selector と action を挙げておきます。
これは繰返しになりますが、
syslogd.conf は
selector -> action
の形式で書くということです。ここまにで出て来た二つの用語を表にまとめておきます:
用語 | 日本語 | 意味
|
---|
selector | 選択 | syslogd.conf の左辺。facility.level のように記述
| action | 指示 | syslogd.conf の右辺
|
selector の書き方
selector は、基本的には facility.level と書きます。
しかし、これに変種が沢山あります。
いろいろと条件を付けることが出来るとも言えます。この facility と level について
順に見てみます。
【facility】
selector = facility.level の左側部分の facility には
auth authpriv cron ftp lpr mail uucp news daemon kern mark user
local0 ... local7
などが良く使われます。何が使われているかは、大体は決っている訳ですが、
これらは、元のプログラムに書かれているものなので、
基本的には調べる必要があります。
【level】
selector = facility.level の指定のうち、ピリオドの右側の水準(level)
には次のようなものがあり、左のものほど緊急なものです。
emerg alert crit err warning notice info debug
この、水準(level) の指定の意味は、
「指定されたものまたはそれ以上」
になります。上の並び方で言えば、「指定されたもの、またはその左側の全て」です。
例えば、
local0.err とすると、err 以上の
emerg, alert, crit も含みます。
上に挙げた 8 項目のうち、
一番右の debug を使って
local1.debug
とすれば、debug が一番右にあるために、それより左側の項目全てを含んでしまいます。それで
結局この場合には、これは local1 の全て、という意味になります。
このような設定とは違って、「何々以上」を指定するのではなくて、
特定のものだけを指定したい時には = を使います。
水準の指定 | 意味 | 例 | 例の意味 |
.level | level 以上 | mail.err | mail の err 以上を記録する |
.=level | level だけ | kern.=debug | kern の debug だけを記録する |
.!=level | level 以外 | auth.!=emerg | auth 全てのうち emerg 以外を記録する |
.none | この facility は全て除く | mail.none | mail.* は除く
|
上の表の最後に .none という項があります。これは
特別な level として none があり、その指定があると、その機能の指定は除くという意味になります。
この「除く」機能は、一番最初の例などのように ; ; で横にいくつか並べて書く時には、
最後の方に書きます。いくつか並んだ場合には、順に読んで、最後のものが有効になります。
daemon.none;*.info
のように書くと、折角 daemon.none で除いたものが *.info で上書きされ、
daemon.info に相当するものは表示されてしまいます。(筆者は、これに 2014/07 に気が付きました ;-)
program,host
facility.level 以外にも、
上のような文のかたまりを、
program または host で指定出来ます。
どの program から受取ったものか、どの host から受取ったものかで選別します。
それらは、
#!+prog1,prog2
!+prog1,prog2
#+prog1,prog2
のように書きます
+ を付けると追加、- を付けると削除になります。
+ を付けないで
#!prog1,prog2
!prog1,prog2
と書いても同じです。
これらの文は、
これが書いてある行の以下全てに有効となります。
#!-prog1,prog2
!-prog1,prog2
#-prog1,prog2
これらの場合には、prog1, prog2 は除かれます。
文字列の一致規則として、例えば
!+subsys
と書いた場合に、kernel からの表示で
subsys:
という文字があれば、これも適用されます。もし
!*
は全てのプログラムという意味です。
このような行があると、
それ以下に記述した規則は全てのプログラムに適用されます。
以上に説明した方法は hostname についても同じように当てはまります。
hostname の代りに @ の字を使うと、それは localhost の意味になります。
【daemon.info だけ分けるには】
/etc/syslog.conf の 初期設定ですと、
*.info;auth,authpriv,cron,ftp,kern,lpr,mail.none /var/log/messages
のようになっていて、「*.info と、それの右側にある facility、ただし mail は全て除く」
ものを /var/log/message に出力するようになっています。
dhcpd の daemon.info の場合、左端の *.info の部分に一致するので、この (selector)
の行が生きて /var/log/messages に出力されます。
これを少し変更して、次のように分けると /var/log/daemon にだけ出るように出来ます。
*.info;auth,authpriv,cron,ftp,kern,lpr,mail.none,daemon.none /var/log/messages
daemon.* /var/log/daemon
例えば、snmpd からの表示が daemon に混ってうるさいから分けたい、
というような時には、次のように書いておけば目的が果せます。
!-snmpd
daemon.* /var/log/daemon
!+snmpd
daemon.* /var/log/snmpd
daemon.named
named からの message を分ける例。 最初に daemon.none としておく
mail@makoto 08:00:03/231123(/etc)% rcsdiff -u syslog.conf
===================================================================
RCS file: RCS/syslog.conf,v
retrieving revision 1.1
diff -u -r1.1 syslog.conf
--- syslog.conf 2023/11/22 22:49:25 1.1
+++ syslog.conf 2023/11/22 22:59:01
@@ -1,7 +1,7 @@
# $NetBSD: syslog.conf,v 1.9 2004/07/23 03:45:42 mycroft Exp $
*.err;kern.*;auth.notice;authpriv.none;mail.crit /dev/console
-*.info;auth,authpriv,cron,ftp,kern,lpr,mail.none /var/log/messages
+*.info;auth,authpriv,cron,ftp,kern,lpr,mail.none,daemon.none /var/log/messages
kern.debug /var/log/messages
# The authpriv log file should be restricted access; these
@@ -17,3 +17,7 @@
*.emerg *
#*.notice root
+!-named
+daemon.* /var/log/daemon
+!+named
+daemon.* /var/log/named
(syslog.conf を変更した時には、下の方の 【syslog.conf を変更した時】も見て下さい)
用語(その二)
いままでに出て来た用語をもう一度まとめて見ます。
用語 | 日本語 | 意味
|
---|
program | プログラム名 |
| hostname | 機械名 |
| facility | 機能 | 「選択」の大分類
| level | 水準 | 「選択」の小分類
|
特殊文字・予約語
また記号等についてまとめると次のようになります。
文字 | 意味 |
(TAB) | 「選択」→「指示」の区切 |
; | 「選択」(selector) をつなぐ |
= | 水準を限定する |
!= | それ以外の水準 |
@ | @ だけ(自機) @機械名 (他の機械に送る) |
+ | 機械名、プログラム名に加える |
- | 機械名、プログラム名から除く |
! | プログラム名指定 |
# | 通常は注釈。あるいは機械名・プログラム名指定に使う |
, | 「機能」 (facility)をつなぐ |
* | .. の全て。何でも。 |
. | 「機能. 水準」のように「機能」と「水準」をつないで、「選択」を作る |
none | .. を除く |
debug虫取
/etc/syslog.conf が意図通り書けているかを見る一つの方法は syslogd に -d -v を付けて
起動することです。これにより、表示画面(端末)を切離すことなく、いろいろと、こまかい
動作内容を表示しながら処理をします。
【DHCP の場合】
それで、DHCP の場合、dhcpd の方のプログラムの中で、「前節のような表示は daemon.info
という selector に出る」ように書いてあり、そのことは man dhcpd にも説明されています。
別の機械に送る
action に @example.com を追加すると、別の機械の syslog に送ることも可能です。
【syslog.conf を変更した時】
-
/var/log/daemon のように自分で出力先を
新しく設定した時には
sudo touch /var/log/daemon
しておきま
す。また
-
/etc/syslog.conf を変更した場合には syslogd に次のようにして kill -1 を送り
ます。(-1 は SIGHUP でも有効です)
sudo kill -1 `cat /var/run/syslogd.pid`
最近なら
sudo /etc/rc.d/syslog restart
の方が簡単です。
man syslog.conf も見て下さい
参考:
http://www.atmarkit.co.jp/flinux/rensai/root03/root03b.html
newsyslog
以上のようにして記録を採っていると、記録がどんどん滞って行きます。
それが溢れないように、圧縮しておき、古くなったものは捨ててくれるしくみがあります。
newsyslog がそれです。/etc/newsyslog.conf に設定し、crontab で次のように起動します。
sudo crontab -l
# rotate log files every hour, if necessary
0 * * * * /usr/bin/newsyslog
/etc/newsyslog.conf
|