web-dev-qa-db-fra.com

Comment puis-je générer des journaux MySQL sur syslog?

Je veux utiliser syslog pour enregistrer MySQL (5.1.41) sur Ubuntu (10.04 LTS). J'ai trouvé des informations qui affichent le journal des erreurs dans syslog.

[mysqld_safe]
syslog

Mais je veux utiliser syslog pour enregistrer les journaux généraux et les journaux de requêtes lentes. Veuillez m'indiquer comment écrire le fichier de configuration?

Je n'ai pas trouvé comment faire cela dans le manuel de référence.

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

13
inohiro

C'est BEAUCOUP plus simplement fait de cette façon:

cd vers les dossiers mysql:

mkfifo mysql-general.log

dans my.cnf, dites-le:

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

Ensuite, configurez votre syslog/syslog-ng pour lire le tube FIFO et faites-le comme il le fera ..

Dans mon cas, je le redirige via net vers un serveur centralisé avec uniquement les journaux d'erreurs et les journaux de requêtes lentes.

Dans les situations où vous souhaitez également conserver la copie locale, définissez-la simplement pour la sortie dans une table et un fichier comme décrit ci-dessus.

12
Joel Hanger

Dans /etc/my.cnf, définissez-le.

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

Modifiez le fichier / etc/rsyslog.conf (RHEL/CentOS) et activez le module imfile pour le lire / path/to/mysql/dir/mysql-general .log puis l'envoyer au serveur syslog distant, en respectant un intervalle configuré dans le paramètre PollingInterval.

Cette section devrait ressembler à ceci ci-dessous:

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

Supprimer le commentaire de la ligne avec WorkDirectory

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

Et configurez-le pour envoyer tous les journaux à distance

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

Ou

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

Ce mécanisme est entièrement différent du syslog du système d'exploitation.

La définition de la sortie du journal peut être définie sur TABLE, FILE (par défaut) ou NONE

si vous l'utilisez

[mysqld]
log-output=TABLE

Cela entraînera la consignation du journal général et/ou du journal lent dans un fichier CSV. Vous pouvez convertir ce CSV en MyISAM comme suit:

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;

Vous pouvez ensuite laisser ce fichier se développer énormément et vous devrez purger la table de temps en temps. Voici comment purger la table general_log et conserver les 3 derniers jours:

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;

Qu'en est-il du syslog (var/log/messages)? Vous devez l'écrire vous-même. Tout d'abord, vous avez besoin de ceci:

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

si vous souhaitez collecter le journal général dans les deux formats ou

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

pour juste le format de fichier.

Maintenant, créez un script pour collecter les modifications dans /var/log/general.log. Le script devrait ressembler beaucoup à ceci:

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

Exécutez ce script toutes les minutes. Je recommande de tronquer le journal général tous les minuit comme ceci

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

Essaie !!!

4
RolandoMySQLDBA