Wie mache ich MySQL -Protokolle an syslog aus?
Frage
Ich möchte Syslog für die Protokollierung von MySQL (5.1.41) auf Ubuntu (10.04 LTS) verwenden. Ich fand Informationen, die Fehlerprotokoll für Syslog ausgab.
[mysqld_safe]
syslog
Aber ich möchte Syslog für die Protokollierung allgemeiner Protokolle und langsamer Abfrageprotokolle verwenden. Bitte beraten Sie mir, wie ich Konfigurationsdatei schreibe.
Ich konnte nicht finden, wie das im Referenzhandbuch geht.
http://dev.mysql.com/doc/refman/5.1/en/log-destinations.html
Lösung
Dies ist viel einfacher auf diese Weise:
CD zu MySQL -Ordnern:
mkfifo mysql-general.log
In my.cnf sagen Sie es:
[mysqld]
general-log-file = /path/to/mysql/dir/mysql-general.log
Konfigurieren Sie dann Ihr Syslog/syslog-ng, um das FIFO-Rohr zu lesen, und machen Sie damit so.
In meinem Fall leite ich es über das Netz über einen zentralisierten Server mit nur den Fehlerprotokollen und den langsamen Abfrageprotokollen.
In Situationen, in denen Sie auch die lokale Kopie behalten möchten, stellen Sie sie einfach so ein, wie oben beschrieben auf Tabelle und Datei ausgegeben werden.
Andere Tipps
Dieser Mechanismus unterscheidet sich völlig vom OS -Syslog.
Wenn Sie dies verwenden
[mysqld]
log-output=TABLE
Dies führt dazu, dass die Protokollierung für das allgemeine Protokoll- und/oder langsames Protokoll zu einer CSV -Datei geht. Sie können diesen 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 den Tisch von Zeit zu Zeit reinigen. Hier erfahren Sie, wie Sie die Tabelle General_log reinigen und die letzten 3 Tage behalten:
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/messus)? Sie müssen das selbst einstellen. Erstens brauchen 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
für nur das Dateiformat.
Machen Sie nun ein Skript, um Änderungen an /var/log/general.log zu sammeln. Das Skript sollte dem sehr ähnlich 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 wie diese abzuschneiden
echo -n > /var/log/mysql-general.log
Versuche es !!!
In /etc/my.cnf, setzen Sie es.
[mysqld]
general-log-file = /path/to/mysql/dir/mysql-general.log
Bearbeiten /etc/rsyslog.conf (Rhel/centos) Datei und Modul aktivieren IMFILE lesen /path/to/mysql/dir/mysql-general.log und senden Sie es dann an Remote Syslog Server und respektieren Sie ein in der konfiguriertes Intervall Abrufintervall Parameter.
Dieser Abschnitt sollte unten so 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")
Die Grenze mit der Linie mit Arbeitsverzeichnis
$WorkDirectory /var/lib/rsyslog # where to place spool files
Und konfigurieren Sie es, um alle Protokolle remote zu senden
*.* @@remote-ip:514 ## For TCP Connection
Oder
*.* @remote-ip:514 ## For UDP Connection