logをmysqlに

Last-modified: 2010-03-10 (水) 23:54:35

apache以外のログについて

  1. syslog-ngで以下のような設定を加える
    template t_mysql {
    template("
        いんさーと いんとぅー syslogng_logs (host, facility, priority, level, tag, date_time, program, msg)
        VALUES ('$HOST', '$FACILITY', '$PRIORITY', '$LEVEL', '$TAG',
        '$YEAR-$MONTH-$DAY $HOUR:$MIN:$SEC', '$PROGRAM', '$MSG');\n
    ");
    template_escape(yes);
    };
    destination dp_mysql { pipe( "/var/log/mysql.pipe" template(t_mysql) ); };
    ....
    log {
      source(s_all);
      destination(dp_mysql);
    };
  2. syslog-ngからのデータを一時的においておく名前つきパイプを作成
    mkfifo /var/log/mysql.pipe
  3. mysqlに専用のユーザとデータベース、テーブルを作る
    1. データベース作成
      mysqladmin create syslogng -p -u root
    2. テーブル作成(syslog-ngに設定した時のテーブル名と同じ名前のテーブルを作る)
      mysql -p -u root
      mysql>create table syslogng_logs (
           > host varchar(32) default NULL,
           > facility varchar(10) default NULL,
           > priority varchar(10) default NULL,
           > level varchar(10) default NULL,
           > tag varchar(10) default NULL,
           > date_time datetime NOT NULL,
           > program varchar(32) default NULL,
           > msg text,
           > seq int(10) unsigned NOT NULL auto_increment,
           > PRIMARY KEY (seq),
           > KEY host (host),
           > KEY seq (seq),
           > KEY program (program),
           > KEY priority (priority),
           > KEY facility (facility),
           > FULLTEXT(msg)
           >);
    3. ユーザ作成
      mysql>grant insert on syslogng.syslogng_logs to syslogng@localhost identified by 'password';
  4. 以下のようなスクリプトを準備
    #!/bin/bash
MYSQL_PIDFILE="/var/run/mysqld/mysqld.pid";
MYSQL_PIPEFILE="/var/log/mysql.pipe";
if [ -e ${MYSQL_PIDFILE} ]; then
       if [ -p ${MYSQL_PIPEFILE} ]; then
               while [ -e ${MYSQL_PIPEFILE} ]
               do
                       #echo "syslog-ng -> mysql";
                       /usr/bin/mysql --user=syslogng --password=password syslogng < ${MYSQL_PIPEFILE}
                       sleep 5
               done
       else
               echo "PIPE file error";
       fi
else
       echo "MYSQL not run";
fi
  1. 上のスクリプトをrc.localからバックグラウンドで呼び出すようにして完了

apacheのログについて

  1. libapache2-mod-log-sql-mysqlパッケージをインストール
  2. 専用のユーザとデータベースを作る
    1. データベース作成
      create database apachelogs;
    2. ユーザ作成
      grant insert,create on apachelogs.* to apacheloguser@localhost identified by 'password';
  3. apache2.confの設定(VirtualHostごとに設定できる)
    LogSQLLoginInfo mysql://ユーザ名:パスワード@localhost/データベース名
    LogSQLCreateTables on
    LogSQLDBParam socketfile mysqlのソケットファイルの場所
    LogSQLTransferLogTable テーブル名
  4. apacheを再起動後、ブラウザからアクセスし、ログが記録されていることを確認