ฉันจะส่งออกบันทึก 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/en/log-destinations.html


ฉันมั่นใจว่าหลายคนถามคำถามนี้ ดังนั้นคุณจะได้รับ +1 เมื่อเปิดเผย Quesiton นี้ต่อสาธารณะ
RolandoMySQLDBA

ข้อควรระวัง : 5.7.5 log_syslogอาจจะมีการเปลี่ยนแปลงการสะกดคำการ
Rick James

คำตอบ:


12

นี่เป็นวิธีที่ทำได้ง่ายกว่ามาก:

โฟลเดอร์ cd to mysql:

mkfifo mysql-general.log

ใน my.cnf บอกว่า:

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

จากนั้นกำหนดค่า syslog / syslog-ng ของคุณเพื่ออ่านไปป์ FIFO และทำตามที่มันจะ ..

ในกรณีของฉันฉันใช้ข้ามสุทธิไปยังเซิร์ฟเวอร์ส่วนกลางที่มีเพียงบันทึกข้อผิดพลาดและบันทึกการสืบค้นที่ช้า

ในสถานการณ์ที่คุณต้องการเก็บสำเนาโลคัลด้วยให้ตั้งค่าเป็นเอาต์พุตไปยังตารางและไฟล์ตามที่อธิบายไว้ข้างต้น


วิธีนั้นฟังดูน่าสนใจ เพียงแค่ต้องเตรียมเครือข่ายของพวกเขาสำหรับ torrents ของการจราจรเพราะทุกอย่างและยายของมันในบันทึกทั่วไป นี้จะแน่นอนเหมาะกับการติดตั้งองค์กรที่ตรวจสอบทุกคำสั่งและ userid ที่เข้าสู่ระบบอย่างเข้มงวดนี่คือ +1 !!!
RolandoMySQLDBA

3
Fifo's ยังมีแนวโน้มที่โชคร้ายที่จะหยุดโปรแกรมฟังใด ๆ หากพวกเขาไม่ได้ถูกเขียนด้วย ดังนั้นถ้า MySQL หยุดเขียนถึงฟีฟ่านี้แล้ว syslog ก็อาจหยุดเช่นกัน
Stefan Lasiewski

4

กลไกนั้นแตกต่างจากระบบปฏิบัติการอย่างสิ้นเชิง

การตั้งค่าล็อกเอาท์พุทสามารถตั้งค่าได้ทั้งในตารางไฟล์ (ค่าเริ่มต้น) หรือไม่มี

ถ้าคุณใช้สิ่งนี้

[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แล้วส่งไปยังเซิร์ฟเวอร์ระยะไกล syslog เคารพช่วงเวลาในการกำหนดค่าพารามิเตอร์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")

Uncoment บรรทัดที่มี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 เพื่อควบคุมการปรับแต่งที่กำหนดเองของคุณ ไฟล์แบบดรอปอินจะเก็บการตรวจสอบการกำหนดค่า distro ตามการอัปเกรดและง่ายต่อการทำแพคเกจและซิงค์กับโฮสต์อื่น ๆ เปรียบเทียบ /etc/php.d, /etc/sysctl.d และ /etc/security/limits.d
user2066657
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.