MySQLログをsyslogに出力するにはどうすればよいですか?


13

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


多くの人がこの質問をしていると思います。したがって、この質問を公開することで+1が得られます。
-RolandoMySQLDBA

注意:5.7.5はスペルをに変更する場合がありますlog_syslog
リックジェームズ

回答:


12

これは、この方法で非常に簡単に実行できます。

mysqlフォルダーにcd:

mkfifo mysql-general.log

my.cnfで教えてください:

[mysqld]
general-log-file = /path/to/mysql/dir/mysql-general.log

次に、syslog / syslog-ngを設定して、FIFOパイプを読み取り、それを実行します。

私の場合は、エラーログとスロークエリログのみを使用して、中央のサーバーにネット経由でパイプします。

ローカルコピーも保持する場合は、上記のようにテーブルとファイルに出力するように設定するだけです。


その方法は興味深く聞こえます。すべてとその祖母が一般的なログに記録されるため、トラフィックの急流に備えてネットワークを準備する必要があります。これは、すべてのコマンドとログインするすべてのユーザーIDを厳密にチェックするエンタープライズインストールに確実に適合します。
-RolandoMySQLDBA

3
fifoには、リスニングプログラムが記述されていない場合、それをフリーズするという残念な傾向もあります。したがって、MySQLがこのfifoへの書き込みを停止すると、syslogも停止する場合があります。
ステファンLasiewski

4

このメカニズムは、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

試してみる !!!


4

/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に設定された間隔を尊重し、その後、リモートsyslogサーバに送信しますPollingIntervalパラメーター。

このセクションは次のようになります。

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

2
/etc/rsyslog.conf自体の編集を避け、/ etc / rsyslog.dで作成されたファイルを使用して、カスタムチューニングを制御することができます。ドロップインファイルは、アップグレードに関するディストリビューション設定のチェックを保持し、他のホストと簡単にパッケージ化および同期できます。/etc/php.d、/etc/sysctl.d、および/etc/security/limits.dを比較します。
user2066657
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.