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
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.
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
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 !!!