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
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.
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
Dieser Mechanismus unterscheidet sich grundlegend vom Betriebssystem-Syslog.
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 !!!