いますぐ実践! Linuxシステム管理

[バックナンバーのトップへ] [Linux システム管理のトップへ]


いますぐ実践! Linux システム管理 / Vol.209 / 読者数:1934名

こんばんは、うすだです。

本業で、 CentOSの初心者的な本の執筆を(もちろん仕事で)お手伝いさせていただいたところ、 著者として名前が載ることになりました。

いつかは「著者」というものになってみたいと思っていましたが、今回、 お給料をいただきつつ、それがさくっと実現してしまうことになります。
…ああ、超ありがたいことだと思っております。

ただ、著者の略歴を、ややくだけた調子で書いて提出しましたら、 他の方に合わせてくださいと言われ、何度か書き直した末、 結局当たりさわりのない略歴となってしまいました。

いつの日か、単独で書籍を書く機会が得られましたら、今回のうっぷん? を晴らすべく、余計な説明の混じったダメな文章にしたいと思います。

自慢話が終わったところで、今回もはりきってまいりましょう!

今回のお題 - rsyslog でDBに記録する

前回、前々回と、rsyslog をご紹介してきました。

Vol.207 - rsyslog の設定をしてみる
http://www.usupi.org/sysad/207.html
Vol.208 - rsyslog ならではの機能を使用する
http://www.usupi.org/sysad/208.html

前回の最後に、今回で rsyslog ネタは最後にしますと言いましたので、 今回で最後にします。

さて、有終の美? を飾るにふさわしいネタはなんだろうと考えましたが、 やはり、大事なログを残すにはデータベースではないでしょうか、 というありきたりな結論に達しました。(検索もしやすいですしね。)

というわけで、今回は、 rsyslog のログを MySQL や PostgreSQL に記録したいと思います。

準備というより前提条件

まず、MySQL か PostgreSQL が使用可能な環境が必要です。
これらの設定手順まで書きますと膨大になってしまいますので、今回は、 すでに使用可能という前提で話を進めます。

そして、MySQL や PostgreSQL が動作するホストと rsyslog が動作するホストは、 別々でも同じでも構いません。
ただし、別々の場合は、rsyslog のホストから各DBへ接続ができるよう、 iptables や設定ファイルなどで許可しておいてください。
(ちなみに以降では、DBが動作するホストが「192.168.1.1」、 rsyslog が動作するホストが「192.168.1.2」と仮定して書いています。)

それから、これらのデータベースに記録するためには、 rsyslog-mysql と rsyslog-pgsql というパッケージをインストールする必要があります。 MySQLなら前者、PostgreSQLなら後者を、yum や apt などでインストールしてください。

さらにそれから、PostgreSQL の説明を、それなりにはしょっています。
ですので、PostgreSQL な貴兄も、 MySQL の説明にさらっと目を通されたほうがよろしいのではないかと思います。

MySQL に記録する - MySQL側の設定

ではまず、MySQL からまいりましょう。
mysqld が動作しているホストで mysql コマンドを実行します。

  $ mysql -u root -p

そして、rsyslog で使用するための、「Syslog」というデータベースと、 「SystemEvents」というテーブルを作成し、 それらにアクセスするための「rsyslog」という専用のユーザを作成します。

Fedora や CentOS な方は、rsyslog-mysql パッケージに含まれる SQL を実行すると、 データベースとテーブルが作成されます。
(バージョン「4.6.2」の部分は、ご使用の環境に合わせてください。)

  mysql> source /usr/share/doc/rsyslog-mysql-4.6.2/createDB.sql

そして、以下の手順で rsyslog ユーザを作成します。
以下では、上記テーブルに対して insert だけを許可しています。
また、localhost からのアクセスだけを許可しています。
(つまり、rsyslog と MySQL が同じホストで動作している場合です。)

  mysql> grant insert on SystemEvents to rsyslog@localhost identified \
  by 'パスワード';

特定のホストやネットワークからのアクセスを許可するなら、 以下のように実行してください。たとえば以下では、 192.168.1.0/24からのアクセスを許可しています。

  mysql> grant insert on SystemEvents to rsyslog@'192.168.1.0/255.255.255.0' \
  identified by 'パスワード';

Debian や Ubuntu の方は、 インストール時に dbconfig-common で設定をするに Yes と答えていれば、 すでになされているはずです。
うっかり No と答えた場合や、rsyslog と MySQL が別々のホストで動作している場合は、 以下のように手動で設定します。
(以下では、例として 192.168.1.2 からのアクセスを許可しています。)

  mysql> create database Syslog;
  mysql> use Syslog;
  mysql> source /usr/share/dbconfig-common/data/rsyslog-mysql/install/mysql
  mysql> grant insert on SystemEvents to rsyslog@192.168.1.2 identified \
  by 'パスワード';

あとは、mysql コマンドを終了させるだけです。

  mysql> \q
  Bye

MySQL に記録する - rsyslog側の設定

MySQL 側の設定が終わりましたら、お次は rsyslog 側の設定です。
ommysql というモジュールをロードして、ommysql を使って記録する設定を、 /etc/rsyslog.d/ 以下のファイルなどに追加します。

Debian や Ubuntu な方で、dbconfig-common による設定を行われた場合ですと、 以下の内容の /etc/rsyslog.d/mysql.conf が作成されていますので、 とりあえず MySQL に記録される設定が済んでいます。
(ただし、以下の場合はすべてのログを記録します。ご注意ください。)

  $ModLoad ommysql
  *.* :ommysql:localhost,Syslog,rsyslog,パスワード

ちなみに2行目の意味は、こうなります。

  ファシリティ.プライオリティ :ommysql:ホスト,DB,ユーザ,パスワード

ファシリティとプライオリティは、以前ご紹介した通りです。
ホストは、MySQLデーモンが動作するホスト、DBはデータベース名、 ユーザおよびパスワードは先に設定したものです。

済んでいない貴兄は、同様の記述を自力で追加しましょう。
たとえば、local5 のすべてのログを、192.168.1.1 の MySQL に登録するには、 以下の設定を /etc/rsyslog.d/ の設定ファイルに追加します。

  $ModLoad ommysql.so
  local5.* :ommysql:192.168.1.1,Syslog,rsyslog,パスワード

いずれにせよ、rsyslogの設定を追加したら、rsyslogd を再起動します。
(ommysqlモジュールを追加するため、reload ではなく再起動します。)

  # service rsyslog restart

あとは、loggerコマンドで何か出力し、DB に追加されることを確認するだけです。

  $ logger -p local5.info "test by logger"

などとして、mysql コマンドで確認します。

  $ mysql -u root -p Syslog
  ...中略...
  mysql> select ID,ReceivedAt,Facility,Priority,Message from SystemEvents;
  +----+---------------------+----------+----------+----------------+
  | ID | ReceivedAt          | Facility | Priority | Message        |
  +----+---------------------+----------+----------+----------------+
  |  1 | 2011-08-19 03:05:30 |       21 |        6 | test by logger |
  +----+---------------------+----------+----------+----------------+
  1 row in set (0.00 sec)

「select * from SystemEvents」とすると、ものすごく見づらくなりますので、 一部だけ表示しています。

MySQL に記録する - テーブルのカスタマイズ

SystemEvents そのままだと、フィールドがやたらと多くて、 参照するのが大変なように感じます。

ですので、必要な情報だけに削ってみたいと思います。
まず、以下のように、テーブルを作成するSQLなファイルを作成します。

  USE Syslog;
  CREATE TABLE IF NOT EXISTS SyslogCustom
  (
      GeneratedTime datetime NULL,
      Facility smallint NULL,
      Priority smallint NULL,
      Message text
  );

4つのフィールドに抜粋した「SyslogCustom」というテーブルを作成する SQL です。 これを mysql コマンド実行内で読み込ませ、 さらに rsyslog ユーザでアクセスできるようにします。

  mysql> source 上記ファイル名
  mysql> grant insert on SyslogCustom to rsyslog@localhost \
  identified by 'パスワード';

そして、rsyslog側では、上記テーブルにinsertするSQL文をテンプレートで定義し、 そのテンプレートを指定します。

  $ModLoad ommysql.so
  $template mysqlCustom,"insert into SyslogCustom (GeneratedTime,\
  Facility, Priority, Message) values ('%timegenerated:::date-mysql%', \
  %syslogfacility%, %syslogpriority%, '%msg%')",SQL
  local5.* :ommysql:localhost,Syslog,rsyslog,パスワード;mysqlCustom

先ほどと同様にrsyslogdを再起動して、logger コマンドで確認すると、 ちゃんと記録されていることがわかります。

  mysql> select * from SyslogCustom;
  +---------------------+----------+----------+-----------------+
  | GeneratedTime       | Facility | Priority | Message         |
  +---------------------+----------+----------+-----------------+
  | 2011-08-19 07:53:56 |       21 |        6 |  test by logger |
  +---------------------+----------+----------+-----------------+
  1 row in set (0.00 sec)

PostgreSQL に記録する - まとめてダイジェストで…

MySQL の説明が終わりましたので、今度は PostgreSQL です。
重複する処理部分は、ややはしょってご紹介します。

やることは同じで、Syslogというデータベースを作り、 SystemEvents というテーブルを作り、rsyslog というユーザを作ります。

Fedora や CentOS の場合は、データベースとテーブルの作成を、 以下の手順で一気に行います。
(前述と同様、4.6.2 の部分は適時変更してください。)

  $ psql < /usr/share/doc/rsyslog-pgsql-4.6.2/createDB.sql

Debian や Ubuntu の場合で、dbconfig-common に任せなかった場合は、 以下の手順でデータベースとテーブルを作成します。

  $ createuser rsyslog
  新しいロールをスーパーユーザとしますか? (y/n) n
  新しいロールにデータベース作成権限を与えますか? (y/n) n
  新しいロールにロールを作成する権限を与えますか? (y/n) n
  $ createdb Syslog
  $ psql Syslog < \
  /usr/share/dbconfig-common/data/rsyslog-pgsql/install/pgsql

そして、rsyslog ユーザを作成します。

  $ psql Syslog
  Syslog=# alter user rsyslog password 'パスワード';
  Syslog=# grant insert on systemevents to rsyslog;
  Syslog=# grant update on systemevents_id_seq to rsyslog;
  Syslog=# \q
  $ 

PostgreSQL側の設定は以上です。
あ、rsyslog なホストからの許可は、pg_hba.conf で記述します。
…が、その設定手順は割愛させていただきます。

 

rsyslog 側の設定は、先ほどと似たような感じです。
Debian や Ubuntu な方で、dbconfig-common による設定を行われた場合ですと、 以下の内容の /etc/rsyslog.d/pgsql.conf が作成済みです。
(ただし、以下の場合はすべてのログを記録します。ご注意ください。)

  $ModLoad ompgsql
  *.* :ompgsql:localhost,Syslog,rsyslog,パスワード

2行目の設定の内訳は、MySQL のときと同じです。
dbconfig-common が /etc/rsyslog.d/pgsql.conf を作成していない場合は、 同様の設定を設定ファイルに追加します。

先ほどと同様にrsyslogdを再起動して、logger コマンドで確認すると、 ちゃんと記録されていることがわかります。
そして、MySQL のときと同様に rsyslogd を再起動し、 logger コマンドで何か出力すると、以下のように記録されていることわかります。

  $ psql Syslog
  Syslog=# select ID,ReceivedAt,Facility,Priority,Message from \
  SystemEvents;
   id |     receivedat      | facility | priority |   message    
  ----+---------------------+----------+----------+-------------------
    1 | 2011-08-19 04:24:45 |       21 |        6 |  test from logger
  (1 行)

 

テーブルをカスタマイズする手順も、ほぼ同様です。
まず、テーブルを生成する SQL 文のファイルを作成し、 psql コマンドに渡して作成してもらいます。さらに、 rsyslog ユーザに insert の許可を与えます。

  $ cat テーブル作成ファイル
  CREATE TABLE SyslogCustom
  (
      GeneratedTime timestamp,
      Facility smallint NULL,
      Priority smallint NULL,
      Message text
  );
  $ psql Syslog < テーブル作成ファイル
  $ psql Syslog
  Syslog=# grant insert on SyslogCustom to rsyslog;

rsyslog 側では、MySQL と同様テンプレートで insert するSQL文を定義して、 そのテンプレートを指定します。

  $ModLoad ompgsql.so
  $template pgsqlCustom,"insert into SyslogCustom (GeneratedTime, \
  Facility, Priority, Message) values ('%timegenerated:::date-rfc3339%', \
  %syslogfacility%, %syslogpriority%, '%msg%')",SQL
  local5.* :ompgsql:localhost,Syslog,rsyslog,パスワード;pgsqlCustom

先ほどと同様にrsyslogdを再起動して、logger コマンドで確認すると、 ちゃんと記録されていることがわかります。

  $ psql Syslog
  Syslog=# select * from SyslogCustom;
         generatedtime        | facility | priority |       message        
  ----------------------------+----------+----------+-------------------
   2011-08-19 04:36:57.803264 |       21 |        5 |  test from logger
  (1 行)

おわりに

以上、rsyslog のログを MySQL や PostgreSQL に記録する方法を、 駆け足でご紹介しました。

MySQL や PostgreSQL がどこかで動いていないと試せないかもしれませんが、 これを機に MySQL などに挑戦してみてもよろしいのではないか、と思います。

あと、BerkeleyDB に記録できたりしてもいいんじゃないかと思います。
余力があれば作ってみたいですね。

宿題の答え

前回の宿題は、

  ファシリティが mail で、22時〜5時(直前)までのログを記録する設定
  をしてみましょう。

でした。

つたないわたしが試行錯誤した結果が、以下になります。

  if $syslogfacility-text == 'mail' and \
     ( $$hour < '5' or $$hour >= '22' ) then \
      /var/log/mail-22-to-5.log

プロパティである syslogfacility-text と $hour を使用しています。
ifの中では、プロパティに $ をつけて参照しますので、$hour は $$hour となります。 ややこしいですね。
また、文字列も数値も ' で囲む必要があるようです。ややこしい…。

今回の宿題

今回の宿題は、

  postfix のログだけを MySQL に記録してみましょう。

です。

別に、postfix ではなく sendmail でも構わないですし、 MySQL ではなく PostgreSQL でも構いません。
ようは、特定の条件のログだけを DB に記録する設定ができればよい、ということです。

あとがき

仕事や人間関係などがうまくいかなくなると、 とたんにマイナス方向へと気持ちが突っ走りがちな、今日この頃です。

そうでなくても、ここのところ土日はいつも、原稿を書いていたり、 絵を描いていたりなばっかりで、ネガティブ傾向が強いように思います。
(好きなことをやっているはずなんですけどね…。)

今日も、くさくさしながらネタを探していたのですが、 逃避でどこぞやのサイトを見ていたら、以下の記事を見つけました。

さよなら心の闇! ネガティブ感情を減らす7つのトレーニング
http://ddnavi.com/serial/13860/

ネガティブ感情を減らし、負のスパイラルから脱出する7つの方法が紹介されています。

正直、中にはこれ無理だろって思ってしまったのもありました。
ですが、健全な気分転換をリスト化しておくとか、 分析してネガティブになりがちな状況を知っておくとか、 なるほどと思えるものもありました。

結局、まわりを変えることはできないので、 自分の考え方や行動を変えるためにどうすればいいか、というところを自分で考えて、 行動してみて、習慣にしていくしかないと思います。(わたしはそう思っています。)

というわけで、読んでなるほどと思ってそれっきりにせず、納得のできた項目を、 これから実際にやってみます。

おっと、やってみようと思います、じゃなく、やってみます、なのです。
ですから、これから実際にやってみます。はい。

…しかし、睡眠不足もネガティブ思考に陥る原因っぽいですので、今日のところは、 健全な気分転換リストの作成だけにしておきます…。

 

さて、次回発行日について、お知らせします。
私事で非常に申し訳ありませんが、次回発行予定の10月16日までの間は、 栗の方の活動で逼迫する予定となっております。
ですので、1回お休みをいただきたいと思います。
まるまる1ヶ月空いてしまいますが、その間によいネタを探して、 万全の体制でご紹介できるようにしたいと思います。
というわけですので、すみませんが、よろしくお願いいたします。

 

今回も、ここまで読んでいただき、たいへんありがとうございました。
次回は、11月6日(日) の未明にお会いしましょう!

 

「いますぐ実践! Linux システム管理」の解除は、以下からできます。
http://www.usupi.org/sysad/ (まぐまぐ ID:149633)

バックナンバーは、こちらにほぼ全部そろっています。
http://www.usupi.org/sysad/backno.html

「栗日記」- 再来週日曜から展示が始まります。これから準備だー…。
http://www.usupi.org/kuri/ (まぐまぐ ID:126454)
http://usupi.seesaa.net/ (栗日記ブログ)
http://usupi.org/k/ (モバイル栗日記)


[バックナンバーのトップへ] [Linux システム管理のトップへ]

トップ

バックナンバー
    [日付順] [目的別]

プロフィール

▼ リンク

独学Linux
Linuxデスクトップ環境に関する情報が満載です。 メルマガもありますよ。
Server World
CentOS 6をサーバとしたときの設定例が、これでもかというくらいたくさん載っています。 CentOS以外のディストリビューション(Fedora, Ubuntu)も充実しています。
LINUXで自宅サーバーを構築・導入(Fedora9)
Fedora9のインストールの仕方から管理方法まで、詳しく載っています。 SearchManには情報がもりだくさんです。
マロンくん.NET
〜サーバ管理者への道〜
Linuxをサーバとして使用するための、いろいろな設定方法が載っています。 マロンくんもかわいいです。 なんといっても、マロンくんという名前がいいですね!!
日経Linux
今や数少なくなってしまったLinuxの雑誌。ニュースやガイドもあります。
Linux Square − @IT
@ITが提供する、Linux の情報が満載。 載っていない設定方法はないんじゃないでしょうか。
gihyo.jp…技術評論社
Linuxに限らず様々な技術情報が満載のサイト。 SoftwareDesign誌も、 ソフトウェア技術者は必見です。
SourceForge.JP Magazine
Linux に限らず、オープンソース関連の記事が網羅されています。
ITmediaエンタープライズ:Linux Tips 一覧
Tips というより FAQ 集でしょうか。わからないことがあれば覗きましょう。
IBM developerWorks : Linux
開発者向けですが、勉強になりますよ。
Yahoo!ニュース - Linux
Yahoo!のLinuxに関するニュース一覧です。
栗日記
システム管理とかと全然関係ありませんが、毎日栗の絵を描いています。
システム管理につかれちゃったとき、癒されたいときに、ご覧ください。:-)
WEB RANKING - PC関連
ランキングに参加してみました。押してやってください。

▼ 作ってみました

Add to Google

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本