Jak wyprowadzać dzienniki MySQL do syslog?

13

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

inohiro
źródło
Jestem pewien, że wielu zadało to pytanie. Dlatego otrzymujesz +1 za publiczne ujawnienie tego pytania.
RolandoMySQLDBA
UWAGA : 5.7.5 może zmieniać pisownię na log_syslog.
Rick James,

Odpowiedzi:

12

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 robił 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.

Joel Hanger
źródło
Ta metoda brzmi intrygująco. Trzeba tylko przygotować ich sieć na potoki ruchu, ponieważ wszystko i jej babcia trafiają do ogólnego dziennika. Byłoby to odpowiednie dla instalacji korporacyjnych, które rygorystycznie sprawdzają każde polecenie i każdy identyfikator użytkownika, który się loguje. To +1!
RolandoMySQLDBA
3
fifo mają również niefortunną tendencję do zawieszania programów słuchania, jeśli nie są również pisane. Jeśli więc MySQL przestanie pisać do tego fifo, syslog może również przestać.
Stefan Lasiewski
4

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

Ustawienie log-output można ustawić na TABLE, FILE (domyślnie) lub NONE

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

RolandoMySQLDBA
źródło
4

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 imfile modułu, aby odczytał /path/to/mysql/dir/mysql-general.log, a następnie wyślij go do zdalnego serwera syslog, przestrzegając interwału skonfigurowanego w Parametr 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
Sergio
źródło
2
Możesz uniknąć edycji samego /etc/rsyslog.conf i użyć pliku utworzonego w /etc/rsyslog.d do kontrolowania własnych ustawień. Pliki drop-in zachowują kontrolę konfiguracji dystrybucji w odniesieniu do aktualizacji oraz są łatwe do spakowania i zsynchronizowania z innymi hostami. Porównaj /etc/php.d, /etc/sysctl.d i /etc/security/limits.d.
user2066657,