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


13

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 pu trouver comment faire cela dans le manuel de référence.

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


Je suis sûr que beaucoup ont posé cette question. Par conséquent, vous obtenez +1 pour avoir révélé cette question publiquement.
RolandoMySQLDBA

ATTENTION : 5.7.5 peut changer l'orthographe en log_syslog.
Rick James

Réponses:


12

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 à travers le réseau 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.


Cette méthode semble intrigante. Il suffit de préparer son réseau aux torrents de trafic car tout et sa grand-mère atterrissent dans le journal général. Cela conviendrait parfaitement aux installations d'entreprise qui vérifient rigoureusement chaque commande et chaque ID utilisateur qui se connecte. C'est un +1 !!!
RolandoMySQLDBA

3
Les fifos ont également la fâcheuse tendance à geler tous les programmes d'écoute s'ils ne sont pas également écrits. Donc, si MySQL arrête d'écrire dans ce fifo, alors syslog peut également s'arrêter.
Stefan Lasiewski

4

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

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 l' imfile du module pour lire /path/to/mysql/dir/mysql-general.log , puis envoyez-le 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 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

2
Vous souhaiterez peut-être éviter de modifier /etc/rsyslog.conf lui-même et utiliser un fichier créé dans /etc/rsyslog.d pour contrôler vos réglages personnalisés. Les fichiers de dépôt préservent les vérifications des configurations de distribution en ce qui concerne les mises à niveau et sont faciles à empaqueter et à synchroniser avec d'autres hôtes. Comparez /etc/php.d, /etc/sysctl.d et /etc/security/limits.d.
user2066657
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.