Ubuntu(10.04 LTS)でMySQL(5.1.41)をロギングするためにsyslogを使用したいです。エラーログをsyslogに出力する情報を見つけました。
[mysqld_safe]
syslog
しかし、syslogを使用して、一般的なログとスロークエリのログを記録したいと考えています。設定ファイルの書き方を教えてください。
リファレンスマニュアルでその方法を見つけることができませんでした。
http://dev.mysql.com/doc/refman/5.1/en/log-destinations.html
これははるかに簡単にこの方法で行われます:
mysqlフォルダーにcdします。
mkfifo mysql-general.log
my.cnfでそれを伝えます:
[mysqld]
general-log-file = /path/to/mysql/dir/mysql-general.log
次に、syslog/syslog-ngを設定してFIFOパイプを読み取り、そのまま処理します。
私の場合は、エラーログとスロークエリログのみを使用して、ネットワーク経由で集中型サーバーにパイプします。
ローカルコピーも保持したい場合は、上記のようにテーブルとファイルに出力するように設定します。
/etc/my.cnfで設定します。
[mysqld]
general-log-file = /path/to/mysql/dir/mysql-general.log
/ etc/rsyslog.conf(RHEL/CentOS)ファイルを編集し、モジュールimfileを有効にして読み取り/ path/to/mysql/dir/mysql-general .logそして、PollingIntervalパラメータで設定された間隔を尊重して、リモートsyslogサーバーに送信します。
このセクションは次のようになります。
module(load="imfile" PollingInterval="1")
input(type="imfile"
File="/path/to/mysql/dir/mysql-general.log"
stateFile="statefile-mysql-general"
Tag="mysql-general"
Severity="warning"
Facility="local1")
WorkDirectoryの行をコメント解除します
$WorkDirectory /var/lib/rsyslog # where to place spool files
すべてのログをリモートで送信するように設定します
*.* @@remote-ip:514 ## For TCP Connection
または
*.* @remote-ip:514 ## For UDP Connection
このメカニズムは、OSのsyslogとはまったく異なります。
ログ出力の設定は、TABLE、FILE(デフォルト)、またはNONEのいずれかに設定できます
これを使えば
[mysqld]
log-output=TABLE
これにより、一般ログまたは低速ログのロギングがCSVファイルに送られます。次のようにして、そのCSVをMyISAMに変換できます。
SET @old_log_state = @@global.general_log;
SET GLOBAL general_log = 'OFF';
ALTER TABLE mysql.general_log ENGINE = MyISAM;
ALTER TABLE mysql.general_log ADD INDEX (event_time);
SET GLOBAL general_log = @old_log_state;
その後、このファイルを途方もなく大きくすることができ、テーブルをときどきパージする必要があります。 general_logテーブルを消去して過去3日間を保持する方法は次のとおりです。
SET @old_log_state = @@global.general_log;
SET GLOBAL general_log = 'OFF';
CREATE TABLE mysql.general_log_new LIKE mysql.general_log;
INSERT INTO mysql.general_log_new
SELECT * FROM mysql.general_log WHERE event_time > NOW() - INTERVAL 3 DAY;
DROP TABLE mysql.general_log;
ALTER TABLE mysql.general_log_new RENAME mysql.general_log;
SET GLOBAL general_log = @old_log_state;
Syslog(var/log/messages)はどうですか?自分でスクリプトを作成する必要があります。まず、次のいずれかが必要です。
[mysqld]
log
log-ouput=TABLE,FILE
general-log-file=/var/log/mysql-general.log
一般的なログを両方の形式で収集する場合、または
[mysqld]
log
general-log-file=/var/log/mysql-general.log
ファイル形式のみ。
/var/log/general.logへの変更を収集するスクリプトを作成します。スクリプトは次のようになります。
NEWCOUNT=`wc -l < /var/log/mysql-general.log`
if [ -f /tmp/general-log-lines.txt ]
then
OLDCOUNT=`cat /tmp/general-log-lines.txt`
if [ ${OLDCOUNT} -lt ${NEWCOUNT} ]
then
DIFF=`echo ${NEWCOUNT}-${OLDCOUNT}|bc`
tail -${DIFF} < /var/log/mysql-general.log >> /var/log/messages
echo ${NEWCOUNT} > /tmp/general-log-lines.txt
fi
fi
このスクリプトを毎分実行します。このように毎晩深夜に一般ログを切り捨てることをお勧めします
echo -n > /var/log/mysql-general.log
試してみる !!!