Як вивести журнали MySQL в syslog?


13

Я хочу використовувати syslog для входу в MySQL (5.1.41) в Ubuntu (10,04 LTS). Я знайшов інформацію, що виводить журнал помилок у syslog.

[mysqld_safe]
syslog

Але я хочу використовувати syslog для ведення загальних журналів та журналів повільних запитів. Підкажіть, будь ласка, як написати конфігураційний файл?

Я не міг знайти, як це зробити у довідковому посібнику.

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


Я впевнений, що багато хто задав це питання. Тому ви отримуєте +1 за те, що розкриєте цей питання публічно.
RolandoMySQLDBA

ПОПЕРЕДЖЕННЯ : 5.7.5 може змінити правопис на log_syslog.
Рік Джеймс

Відповіді:


12

Це набагато простіше зробити так:

CD в ​​папки mysql:

mkfifo mysql-general.log

в my.cnf скажи це:

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

Потім налаштуйте ваш syslog / syslog-ng, щоб він прочитав трубу FIFO, і зробіть з нею так, як буде.

У моєму випадку я передаю його через мережу на централізований сервер із лише журналами помилок та журналами повільних запитів.

У ситуаціях, коли ви також хочете зберегти локальну копію, просто встановіть її для виведення у таблицю та файл, як описано вище.


Цей метод звучить інтригуюче. Треба просто підготувати свою мережу до потоків трафіку, тому що все, і його бабуся приземляється в загальний журнал. Це, безумовно, підходило б для корпоративних установок, які суворо перевіряють кожну команду та кожного користувача, що входить у систему. Це +1 !!!
RolandoMySQLDBA

3
фіфо також мають нещасну тенденцію заморожувати будь-які програми прослуховування, якщо вони теж не написані. Отже, якщо MySQL перестає писати на цю програму, то й syslog може припинитися.
Стефан Ласевський

4

Цей механізм повністю відрізняється від системного журналу ОС.

Налаштування журналу-виводу може бути встановлено як TABLE, FILE (за замовчуванням), або NONE

якщо ви використовуєте це

[mysqld]
log-output=TABLE

Це призведе до того, що журнал загального журналу та / або повільного журналу перейде у файл CSV. Ви можете перетворити цей CSV в MyISAM наступним чином:

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;

Тоді ви можете дозволити цьому файлу надзвичайно зрости, і вам доведеться щодня часто чистити стіл. Ось як очистити таблицю General_log та зберегти останні 3 дні:

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;

Що з syslog (var / log / messages)? Ви повинні самі це сценарію. По-перше, вам або потрібно це:

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

якщо ви хочете зібрати загальний журнал в обох форматах або

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

лише для формату файлу.

Тепер створіть сценарій для збору змін у /var/log/general.log. Сценарій повинен виглядати приблизно так:

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

Запускайте цей сценарій щохвилини. Я рекомендую обрізати загальний журнал кожну півночі, як це

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

Спробувати !!!


4

В /etc/my.cnf встановіть його.

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

Редагувати /etc/rsyslog.conf (RHEL / CentOS) файл і включити модуль imfile читати /path/to/mysql/dir/mysql-general.log , а потім відправити його на віддалений сервер системного журналу, поважаючи інтервал , виконаний в Параметр PollingInterval .

Цей розділ повинен виглядати приблизно так:

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

Від’єднайте рядок з WorkDirectory

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

І налаштуйте його для віддаленого надсилання всіх журналів

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

Або

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

2
Ви можете уникнути редагування /etc/rsyslog.conf, а також використовувати файл, створений у /etc/rsyslog.d, для керування своїми налаштуваннями. Файли, що випадають, зберігають перевірки конфігурацій дистрибутива відносно оновлень та їх легко упакувати та синхронізувати з іншими хостами. Порівняйте /etc/php.d, /etc/sysctl.d та /etc/security/limits.d.
користувач2066657
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.