Come posso inviare i log di MySQL a syslog?


13

Voglio usare syslog per la registrazione di MySQL (5.1.41) su Ubuntu (10.04 LTS). Ho trovato informazioni che hanno generato il log degli errori su syslog.

[mysqld_safe]
syslog

Ma voglio usare syslog per registrare registri generali e registri di query lente. Per favore, mi consigli come scrivere il file di configurazione?

Non sono riuscito a trovare come farlo nel manuale di riferimento.

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


Sono sicuro che molti hanno posto questa domanda. Pertanto, ottieni +1 per aver rivelato pubblicamente questo quesiton.
RolandoMySQLDBA il

ATTENZIONE : 5.7.5 potrebbe cambiare l'ortografia in log_syslog.
Rick James,

Risposte:


12

Questo è MOLTO più semplicemente fatto in questo modo:

Cartelle da cd a mysql:

mkfifo mysql-general.log

in my.cnf dillo:

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

Quindi, configura il tuo syslog / syslog-ng per leggere la pipe FIFO e farcela come sarà.

Nel mio caso, lo installo attraverso la rete a un server centralizzato con solo i log degli errori e i log delle query lente.

Nelle situazioni in cui si desidera conservare anche la copia locale, è sufficiente impostarlo su output su tabella e file come descritto sopra.


Questo metodo sembra intrigante. Uno deve solo preparare la propria rete per torrenti di traffico perché tutto e sua nonna arrivano nel registro generale. Ciò si adatterebbe perfettamente alle installazioni aziendali che controllano rigorosamente ogni comando e ogni ID utente che accede. Questo è un +1 !!!
RolandoMySQLDBA,

3
I Fifo hanno anche la sfortunata tendenza di congelare qualsiasi programma di ascolto se non vengono scritti anche loro. Quindi, se MySQL smette di scrivere su questo Fifo, anche Syslog potrebbe smettere.
Stefan Lasiewski,

4

Tale meccanismo è completamente diverso dal syslog del sistema operativo.

L'impostazione dell'output del log può essere impostata su TABLE, FILE (impostazione predefinita) o NONE

se lo usi

[mysqld]
log-output=TABLE

Ciò causerà la registrazione per il registro generale e / o il registro lento per passare a un file CSV. Puoi convertire quel CSV in MyISAM come segue:

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;

Puoi quindi lasciare che questo file cresca enormemente e dovrai eliminare la tabella ogni tanto. Ecco come eliminare la tabella general_log e conservare gli ultimi 3 giorni:

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;

Che dire del syslog (var / log / messages)? Devi scriverlo tu stesso. Innanzitutto, hai bisogno di questo:

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

se si desidera raccogliere il registro generale in entrambi i formati o

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

solo per il formato del file.

Ora crea uno script per raccogliere le modifiche in /var/log/general.log. Lo script dovrebbe assomigliare molto a questo:

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

Esegui questo script ogni minuto. Consiglio di troncare il registro generale ogni mezzanotte in questo modo

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

Provaci !!!


4

In /etc/my.cnf, impostalo.

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

Modifica il file /etc/rsyslog.conf (RHEL / CentOS) e abilita il modulo imfile a leggere /path/to/mysql/dir/mysql-general.log e quindi invialo al server remoto syslog, rispettando un intervallo configurato nel Parametro PollingInterval .

Questa sezione dovrebbe essere simile al seguente:

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 linea con WorkDirectory

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

E configuralo per inviare tutti i log in remoto

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

O

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

2
Potresti voler evitare di modificare /etc/rsyslog.conf stesso e usare un file creato in /etc/rsyslog.d per controllare le tue accordature personalizzate. I file drop-in conservano i controlli delle configurazioni di distribuzione rispetto agli aggiornamenti e sono facili da impacchettare e sincronizzare con altri host. Confronta /etc/php.d, /etc/sysctl.d e /etc/security/limits.d.
user2066657
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.