it-swarm.dev

Jak wyprowadzać dzienniki MySQL do syslog?

Chcę używać syslog do logowania MySQL (5.1.41) na Ubuntu (10.04 LTS). Znalazłem informacje, które wysyłają dziennik błędów do syslog.

[mysqld_safe]
syslog

Ale chcę używać syslog do rejestrowania dzienników ogólnych i dzienników powolnych zapytań. Proszę mi doradzić, jak napisać plik konfiguracyjny?

Nie mogłem znaleźć tego w podręczniku referencyjnym.

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

13
inohiro

Jest to DUŻO prościej zrobione w ten sposób:

cd do folderów mysql:

mkfifo mysql-general.log

w my.cnf powiedz:

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

Następnie skonfiguruj swój syslog/syslog-ng, aby czytał potok FIFO i rób z nim, jak to będzie ...

W moim przypadku przesyłam go przez sieć do scentralizowanego serwera zawierającego tylko dzienniki błędów i dzienniki wolnych zapytań.

W sytuacjach, w których chcesz również zachować kopię lokalną, ustaw ją tak, aby wyświetlała dane wyjściowe w tabeli i pliku, jak opisano powyżej.

12
Joel Hanger

Ustaw /etc/my.cnf.

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

Edytuj plik / etc/rsyslog.conf (RHEL/CentOS) i włącz moduł imfile do odczytu / path/to/mysql/dir/mysql-general .log, a następnie wyślij go do zdalnego serwera syslog, przestrzegając interwału skonfigurowanego w parametrze PollingInterval.

Ta sekcja powinna wyglądać tak:

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

Odkomentuj linię z WorkDirectory

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

I skonfiguruj go, aby wysyłał wszystkie dzienniki zdalnie

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

Lub

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

Ten mechanizm jest zupełnie inny niż syslog systemu operacyjnego.

stawienie log-output można ustawić na TABELA, PLIK (domyślnie) lub BRAK

jeśli tego użyjesz

[mysqld]
log-output=TABLE

Spowoduje to, że rejestrowanie dziennika ogólnego i/lub dziennika powolnego przejdzie do pliku CSV. Możesz przekonwertować ten CSV na MyISAM w następujący sposób:

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;

Następnie możesz pozwolić, aby ten plik ogromnie urósł i będziesz musiał co jakiś czas czyścić tabelę. Oto jak wyczyścić tabelę general_log i zachować ostatnie 3 dni:

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;

Co z syslog (var/log/messages)? Musisz sam to napisać. Po pierwsze potrzebujesz tego:

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

jeśli chcesz zebrać ogólny log w obu formatach lub

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

tylko dla formatu pliku.

Teraz stwórz skrypt do zbierania zmian w /var/log/general.log. Skrypt powinien wyglądać podobnie do tego:

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

Uruchom ten skrypt co minutę. Zalecam obcinanie dziennika ogólnego o takiej północy

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

Spróbuj !!!

4
RolandoMySQLDBA