¿Cómo envío los registros de MySQL a syslog?

13

Quiero usar syslog para registrar MySQL (5.1.41) en Ubuntu (10.04 LTS). Encontré información que generaba un registro de errores en syslog.

[mysqld_safe]
syslog

Pero quiero usar syslog para registrar registros generales y registros de consultas lentas. Por favor, avíseme cómo escribir el archivo de configuración?

No pude encontrar cómo hacerlo en el manual de referencia.

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

inohiro
fuente
Estoy seguro de que muchos han hecho esta pregunta. Por lo tanto, obtienes +1 por revelar esta pregunta públicamente.
RolandoMySQLDBA
PRECAUCIÓN : 5.7.5 puede estar cambiando la ortografía a log_syslog.
Rick James el

Respuestas:

12

Esto es MUCHO más simple hecho de esta manera:

cd a las carpetas de mysql:

mkfifo mysql-general.log

en my.cnf dilo:

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

Luego, configure su syslog / syslog-ng para leer la tubería FIFO y hacer lo que quiera.

Sin embargo, en mi caso, lo canalizo a través de la red a un servidor centralizado con solo los registros de errores y los registros de consultas lentas.

En situaciones en las que desea conservar también la copia local, simplemente configúrela como salida a la tabla y al archivo como se describe anteriormente.

Joel Hanger
fuente
Ese método suena intrigante. Uno solo debe preparar su red para torrentes de tráfico porque todo y su abuela aterrizan en el registro general. Esto definitivamente se adaptaría a las instalaciones empresariales que verifican rigurosamente cada comando y cada ID de usuario que inicia sesión. ¡Esto es un +1!
RolandoMySQLDBA
3
los fifo también tienen la desafortunada tendencia de congelar cualquier programa de escucha si no se están escribiendo también. Entonces, si MySQL deja de escribir en este fifo, entonces syslog también puede detenerse.
Stefan Lasiewski
4

Ese mecanismo es completamente diferente del syslog del sistema operativo.

La configuración de la salida de registro se puede establecer en TABLE, FILE (predeterminado) o NONE

si usas esto

[mysqld]
log-output=TABLE

Esto hará que el registro para el registro general y / o el registro lento vaya a un archivo CSV. Puede convertir ese CSV a MyISAM de la siguiente manera:

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;

Luego puede dejar que este archivo crezca enormemente y tendrá que purgar la tabla de vez en cuando. Aquí se explica cómo purgar la tabla general_log y conservar los últimos 3 días:

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é pasa con el syslog (var / log / messages)? Debes escribir eso tú mismo. Primero, o necesitas esto:

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

si desea recopilar el registro general en ambos formatos o

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

solo por el formato de archivo.

Ahora haga un script para recopilar cambios en /var/log/general.log. El script debería parecerse mucho a esto:

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

Ejecute este script cada minuto. Recomiendo truncar el registro general cada medianoche como este

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

Darle una oportunidad !!!

RolandoMySQLDBA
fuente
4

En /etc/my.cnf, configúrelo.

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

Editar /etc/rsyslog.conf (RHEL / CentOS) de archivos y permitir que el módulo imfile leer /path/to/mysql/dir/mysql-general.log y luego, enviarlo al servidor de registro del sistema remoto, respetando un intervalo configurado en el Parámetro PollingInterval .

Esta sección debería verse así a continuación:

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

Uncoment la línea con WorkDirectory

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

Y configúrelo para enviar todos los registros de forma remota

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

O

 *.* @remote-ip:514 ## For UDP Connection
Sergio
fuente
2
Es posible que desee evitar editar /etc/rsyslog.conf en sí mismo y utilizar un archivo creado en /etc/rsyslog.d para controlar sus ajustes personalizados. Los archivos desplegables conservan las comprobaciones de las configuraciones de distribución con respecto a las actualizaciones, y son fáciles de empaquetar y sincronizar con otros hosts. Compare /etc/php.d, /etc/sysctl.d y /etc/security/limits.d.
user2066657