Bagaimana cara mengeluarkan log MySQL ke syslog?

13

Saya ingin menggunakan syslog untuk mencatat MySQL (5.1.41) di Ubuntu (10.04 LTS). Saya menemukan informasi yang menampilkan log kesalahan ke syslog.

[mysqld_safe]
syslog

Tapi saya ingin menggunakan syslog untuk mencatat log umum dan log permintaan lambat. Tolong beri tahu saya cara menulis file konfigurasi?

Saya tidak dapat menemukan cara melakukannya di manual referensi.

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

inohiro
sumber
Saya yakin banyak yang menanyakan pertanyaan ini. Karenanya, Anda mendapatkan +1 untuk mengungkapkan pertanyaan ini secara publik.
RolandoMySQLDBA
PERHATIAN : 5.7.5 mungkin mengubah ejaan ke log_syslog.
Rick James

Jawaban:

12

Ini JAUH lebih sederhana dilakukan dengan cara ini:

cd ke folder mysql:

mkfifo mysql-general.log

di my.cnf katakan:

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

Kemudian, konfigurasikan syslog / syslog-ng Anda untuk membaca pipa FIFO dan lakukan sesuai keinginan.

Dalam kasus saya, saya menyalurkannya melalui net ke server terpusat dengan hanya log kesalahan dan log permintaan lambat.

Dalam situasi di mana Anda ingin menyimpan salinan lokal, cukup atur ke output ke tabel dan file seperti yang dijelaskan di atas.

Joel Hanger
sumber
Metode itu terdengar menarik. Orang hanya harus mempersiapkan jaringan mereka untuk arus lalu lintas karena semuanya dan neneknya mendarat di log umum. Ini akan sesuai dengan instalasi perusahaan yang secara ketat memeriksa setiap perintah dan setiap userid yang login. Ini adalah +1 !!!
RolandoMySQLDBA
3
fifo juga memiliki kecenderungan yang tidak menguntungkan untuk membekukan semua program mendengarkan jika mereka tidak ditulis juga. Jadi, jika MySQL berhenti menulis ke fifo ini, maka syslog juga dapat berhenti.
Stefan Lasiewski
4

Mekanisme itu sama sekali berbeda dari OS syslog.

Pengaturan log-output dapat diatur ke TABLE, FILE (default), atau NONE

jika Anda menggunakan ini

[mysqld]
log-output=TABLE

Ini akan menyebabkan logging untuk log umum dan / atau log lambat untuk pergi ke file CSV. Anda dapat mengonversi CSV ke MyISAM sebagai berikut:

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;

Anda kemudian dapat membiarkan file ini tumbuh dengan luar biasa dan Anda harus membersihkan tabel begitu sering. Berikut ini cara membersihkan tabel general_log dan menyimpan 3 hari terakhir:

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;

Bagaimana dengan syslog (var / log / messages)? Anda harus membuat skrip sendiri. Pertama, Anda perlu ini:

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

jika Anda ingin mengumpulkan log umum dalam kedua format atau

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

hanya untuk format file.

Sekarang buat skrip untuk mengumpulkan perubahan pada /var/log/general.log. Script akan terlihat seperti ini:

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

Jalankan skrip ini setiap menit. Saya sarankan memotong log umum setiap tengah malam seperti ini

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

Cobalah !!!

RolandoMySQLDBA
sumber
4

Di /etc/my.cnf, atur.

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

Edit file /etc/rsyslog.conf (RHEL / CentOS), dan aktifkan modul imfile untuk membaca /path/to/mysql/dir/mysql-general.log dan kemudian, kirimkan ke server syslog jarak jauh, dengan menghormati interval yang dikonfigurasi di dalam Parameter PollingInterval .

Bagian ini akan terlihat seperti ini di bawah ini:

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

Batalkan baris dengan WorkDirectory

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

Dan konfigurasikan untuk mengirim semua log dari jarak jauh

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

Atau

 *.* @remote-ip:514 ## For UDP Connection
Sergio
sumber
2
Anda mungkin ingin menghindari mengedit /etc/rsyslog.conf itu sendiri, dan menggunakan file yang dibuat di /etc/rsyslog.d untuk mengontrol penyetelan kustom Anda. File drop-in menjaga pemeriksaan konfigurasi distro sehubungan dengan peningkatan, dan mudah untuk mengemas dan menyinkronkan ke host lain. Bandingkan /etc/php.d, /etc/sysctl.d dan /etc/security/limits.d.
user2066657