it-swarm.com.de

Wie gebe ich MySQL-Protokolle in Syslog aus?

Ich möchte Syslog zum Protokollieren von MySQL (5.1.41) unter Ubuntu (10.04 LTS) verwenden. Ich habe Informationen gefunden, die das Fehlerprotokoll an syslog ausgeben.

[mysqld_safe]
syslog

Ich möchte jedoch Syslog zum Protokollieren allgemeiner Protokolle und langsamer Abfrageprotokolle verwenden. Bitte raten Sie mir, wie man eine Konfigurationsdatei schreibt.

Wie das geht, konnte ich im Referenzhandbuch nicht finden.

http://dev.mysql.com/doc/refman/5.1/en/log-destinations.html

13
inohiro

Dies ist viel einfacher auf diese Weise gemacht:

cD in MySQL-Ordner:

mkfifo mysql-general.log

in my.cnf sag es:

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

Konfigurieren Sie dann Ihr syslog/syslog-ng so, dass es die FIFO - Pipe) liest und damit macht, wie es will.

In meinem Fall leite ich es über das Netz an einen zentralen Server mit nur den Fehlerprotokollen und langsamen Abfrageprotokollen.

In Situationen, in denen Sie auch die lokale Kopie behalten möchten, stellen Sie sie einfach so ein, dass sie wie oben beschrieben in Tabelle und Datei ausgegeben wird.

12
Joel Hanger

Legen Sie in /etc/my.cnf fest.

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

Bearbeiten Sie die Datei / etc/rsyslog.conf (RHEL/CentOS) und aktivieren Sie das Modul imfile zum Lesen von / path/to/mysql/dir/mysql-general) .log und senden Sie es dann an den Remote-Syslog-Server. Beachten Sie dabei ein Intervall, das im Parameter PollingInterval konfiguriert wurde.

Dieser Abschnitt sollte wie folgt aussehen:

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")

Entfernen Sie die Zeile mit WorkDirectory

$WorkDirectory /var/lib/rsyslog # where to place spool files

Und konfigurieren Sie es so, dass alle Protokolle remote gesendet werden

*.* @@remote-ip:514 ## For TCP Connection

Oder

 *.* @remote-ip:514 ## For UDP Connection
4
Sergio

Dieser Mechanismus unterscheidet sich grundlegend vom Betriebssystem-Syslog.

Die Einstellung der Protokollausgabe kann entweder auf TABLE, FILE (Standard) oder NONE eingestellt werden.

wenn Sie dies verwenden

[mysqld]
log-output=TABLE

Dadurch wird die Protokollierung für das allgemeine Protokoll und/oder das langsame Protokoll in eine CSV-Datei verschoben. Sie können diese CSV wie folgt in MyISAM konvertieren:

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;

Sie können diese Datei dann enorm wachsen lassen und müssen die Tabelle von Zeit zu Zeit löschen. So löschen Sie die Tabelle general_log und behalten die letzten 3 Tage bei:

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;

Was ist mit dem Syslog (var/log/messages)? Sie müssen das selbst schreiben. Zunächst benötigen Sie entweder Folgendes:

[mysqld]
log
log-ouput=TABLE,FILE
general-log-file=/var/log/mysql-general.log

wenn Sie das allgemeine Protokoll in beiden Formaten oder sammeln möchten

[mysqld]
log
general-log-file=/var/log/mysql-general.log

nur für das Dateiformat.

Erstellen Sie nun ein Skript, um Änderungen an /var/log/general.log zu erfassen. Das Skript sollte ungefähr so ​​aussehen:

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

Führen Sie dieses Skript jede Minute aus. Ich empfehle, das allgemeine Protokoll jede Mitternacht so abzuschneiden

echo -n > /var/log/mysql-general.log

Versuche es !!!

4
RolandoMySQLDBA