Como faço para gerar logs do MySQL para o syslog?

13

Eu quero usar o syslog para registrar o MySQL (5.1.41) no Ubuntu (10.04 LTS). Encontrei informações que geram log de erro no syslog.

[mysqld_safe]
syslog

Mas eu quero usar o syslog para registrar logs gerais e logs de consultas lentos. Por favor, informe-me como escrever o arquivo de configuração?

Não consegui encontrar como fazer isso no manual de referência.

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

inohiro
fonte
Tenho certeza que muitos fizeram essa pergunta. Portanto, você recebe +1 por revelar essa pergunta publicamente.
RolandoMySQLDBA
CUIDADO : 5.7.5 pode estar alterando a ortografia paralog_syslog .
Rick James

Respostas:

12

Isso é muito mais simples:

cd para pastas mysql:

mkfifo mysql-general.log

no my.cnf diga:

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

Em seguida, configure seu syslog / syslog-ng para ler o canal FIFO e faça com ele como ele será.

No meu caso, eu o canalizo através da rede para um servidor centralizado, apenas com os logs de erros e os logs de consultas lentos.

Nas situações em que você deseja manter a cópia local, defina-a como saída para tabela e arquivo, conforme descrito acima.

Joel Hanger
fonte
Esse método parece intrigante. É preciso preparar sua rede para torrents de tráfego, porque tudo e sua avó chegam ao log geral. Isso definitivamente se adequaria às instalações corporativas que verificam rigorosamente todos os comandos e todos os IDs de usuários que fazem login.
RolandoMySQLDBA
3
Os fifo também têm a infeliz tendência de congelar qualquer programa de audição se eles também não estiverem sendo gravados. Portanto, se o MySQL parar de escrever neste fifo, o syslog também poderá parar.
Stefan Lasiewski
4

Esse mecanismo é totalmente diferente do syslog do SO.

A configuração da saída de log pode ser definida como TABLE, FILE (padrão) ou NENHUM

se você usar isso

[mysqld]
log-output=TABLE

Isso fará com que o log do log geral e / ou log lento vá para um arquivo CSV. Você pode converter esse CSV para MyISAM da seguinte maneira:

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;

Você pode deixar esse arquivo crescer tremendamente e precisará limpar a tabela de vez em quando. Aqui está como limpar a tabela general_log e manter os últimos 3 dias:

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;

E o syslog (var / log / messages)? Você deve escrever isso sozinho. Primeiro, você precisa disso:

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

se você deseja coletar o log geral nos dois formatos ou

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

apenas para o formato do arquivo.

Agora faça um script para coletar alterações em /var/log/general.log. O script deve se parecer muito com isso:

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

Execute esse script a cada minuto. Eu recomendo truncar o log geral toda meia-noite como esta

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

De uma chance !!!

RolandoMySQLDBA
fonte
4

No /etc/my.cnf, defina-o.

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

Edite o arquivo /etc/rsyslog.conf (RHEL / CentOS) e habilite o módulo imfile para ler /path/to/mysql/dir/mysql-general.log e, em seguida, envie-o para o servidor syslog remoto, respeitando um intervalo configurado no diretório PollingInterval Parâmetro .

Esta seção deve ficar assim:

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

Descomente a linha com o WorkDirectory

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

E configure-o para enviar todos os logs remotamente

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

Ou

 *.* @remote-ip:514 ## For UDP Connection
Sergio
fonte
2
Você pode evitar a edição do /etc/rsyslog.conf e usar um arquivo criado no /etc/rsyslog.d para controlar suas configurações personalizadas. Os arquivos drop-in preservam as verificações das configurações da distribuição em relação às atualizações e são fáceis de empacotar e sincronizar com outros hosts. Compare /etc/php.d, /etc/sysctl.d e /etc/security/limits.d.
user2066657