Wie gebe ich MySQL-Protokolle in syslog aus?

13

Ich möchte Syslog für die Protokollierung von MySQL (5.1.41) unter Ubuntu (10.04 LTS) verwenden. Ich habe Informationen gefunden, die das Fehlerprotokoll in Syslog ausgeben.

[mysqld_safe]
syslog

Aber ich möchte Syslog für die Protokollierung von allgemeinen Protokollen und langsamen Abfrageprotokollen verwenden. Bitte raten Sie mir, wie man Konfigurationsdatei schreibt?

Ich konnte im Referenzhandbuch nicht finden, wie das geht.

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

inohiro
quelle
Ich bin sicher, dass viele diese Frage gestellt haben. Deshalb bekommst du +1, wenn du diese Frage öffentlich enthüllst.
RolandoMySQLDBA
VORSICHT : 5.7.5 kann die Änderung der Schreibweise log_syslog.
Rick James

Antworten:

12

Das geht VIEL einfacher so:

cd to 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, um die FIFO-Pipe zu lesen, und machen Sie es so, wie es sein wird.

In meinem Fall leite ich es über das Netz an einen zentralen Server weiter, der jedoch nur die Fehlerprotokolle und langsamen Abfrageprotokolle enthält.

In Situationen, in denen Sie auch lokale Kopien behalten möchten, stellen Sie diese einfach wie oben beschrieben auf Ausgabe in Tabelle und Datei ein.

Joel Hanger
quelle
Diese Methode klingt faszinierend. Man muss nur sein Netzwerk für Ströme von Verkehr vorbereiten, weil alles und seine Großmutter im allgemeinen Protokoll landet. Dies ist definitiv für Unternehmensinstallationen geeignet, die jeden Befehl und jede Benutzer-ID, die sich anmeldet, streng prüfen. Dies ist eine +1 !!!
RolandoMySQLDBA
3
fifos haben auch die unglückliche Tendenz, Hörprogramme einzufrieren, wenn sie nicht auch geschrieben werden. Wenn MySQL aufhört, in dieses FIFO zu schreiben, wird Syslog möglicherweise ebenfalls beendet.
Stefan Lasiewski
4

Dieser Mechanismus unterscheidet sich grundlegend vom Betriebssystem-Syslog.

Das Einstellen der Protokollausgabe kann entweder auf TABLE, FILE (Standardeinstellung) oder NONE festgelegt werden

wenn du das verwendest

[mysqld]
log-output=TABLE

Dies bewirkt, dass die Protokollierung für das allgemeine Protokoll und / oder das langsame Protokoll in eine CSV-Datei wechselt. 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 vergrößern und müssen die Tabelle von Zeit zu Zeit leeren. So löschen Sie die general_log-Tabelle 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 sammeln möchten oder

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

nur für das Dateiformat.

Erstellen Sie jetzt 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 alle Mitternacht so abzuschneiden

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

Versuche es !!!

RolandoMySQLDBA
quelle
4

Stellen Sie es in /etc/my.cnf ein.

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

Bearbeiten /etc/rsyslog.conf (RHEL / CentOS) Datei und Aktivierungsmodul imfile lesen /path/to/mysql/dir/mysql-general.log und dann, an einen Zielfern Syslogserver, ein Intervall in dem konfigurierten respektieren PollingInterval- Parameter.

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

Deaktivieren 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
Sergio
quelle
2
Möglicherweise möchten Sie vermeiden, /etc/rsyslog.conf selbst zu bearbeiten, und eine Datei verwenden, die in /etc/rsyslog.d erstellt wurde, um Ihre benutzerdefinierten Einstellungen zu steuern. Die Drop-In-Dateien bewahren die Überprüfungen der Distributionskonfigurationen in Bezug auf Upgrades und sind einfach zu packen und mit anderen Hosts zu synchronisieren. Vergleichen Sie /etc/php.d, /etc/sysctl.d und /etc/security/limits.d.
user2066657