Làm cách nào để xuất nhật ký MySQL sang syslog?


13

Tôi muốn sử dụng syslog để đăng nhập MySQL (5.1.41) trên Ubuntu (10.04 LTS). Tôi tìm thấy thông tin mà đầu ra lỗi đăng nhập vào syslog.

[mysqld_safe]
syslog

Nhưng tôi muốn sử dụng syslog để ghi nhật ký chung và nhật ký truy vấn chậm. Xin tư vấn cho tôi cách viết file config?

Tôi không thể tìm thấy làm thế nào để làm điều đó trong hướng dẫn tham khảo.

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


Tôi chắc chắn nhiều người đã hỏi câu hỏi này. Do đó, bạn nhận được +1 để tiết lộ công khai quesiton này.
RolandoMySQLDBA

THẬN TRỌNG : 5.7.5 có thể thay đổi chính tả thành log_syslog.
Rick James

Câu trả lời:


12

Đây là cách đơn giản hơn được thực hiện theo cách này:

thư mục cd đến mysql:

mkfifo mysql-general.log

trong my.cnf nói với nó:

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

Sau đó, định cấu hình syslog / syslog-ng của bạn để đọc ống FIFO và làm với nó như nó sẽ ..

Trong trường hợp của tôi, tôi chuyển nó qua mạng đến một máy chủ tập trung chỉ có các nhật ký lỗi và nhật ký truy vấn chậm.

Trong trường hợp bạn cũng muốn giữ bản sao cục bộ, chỉ cần đặt nó thành đầu ra thành bảng và tệp như mô tả ở trên.


Phương pháp đó nghe hấp dẫn. Người ta chỉ cần chuẩn bị mạng của họ cho dòng xe cộ vì tất cả mọi thứ và bà của nó đều nằm trong nhật ký chung. Điều này sẽ xác định phù hợp với các cài đặt doanh nghiệp kiểm tra nghiêm ngặt mọi lệnh và mọi người dùng đăng nhập. Đây là +1 !!!
RolandoMySQLDBA

3
fifo cũng có xu hướng đáng tiếc đóng băng bất kỳ chương trình nghe nào nếu chúng không được viết quá. Vì vậy, nếu MySQL dừng ghi vào fifo này, thì syslog cũng có thể dừng lại.
Stefan Lasiewski

4

Cơ chế đó hoàn toàn khác với syslog của hệ điều hành.

Cài đặt đầu ra nhật ký có thể được đặt thành BẢNG, TẬP_TIN (mặc định) hoặc KHÔNG

nếu bạn sử dụng cái này

[mysqld]
log-output=TABLE

Điều này sẽ khiến việc ghi nhật ký cho nhật ký chung và / hoặc nhật ký chậm chuyển đến tệp CSV. Bạn có thể chuyển đổi CSV đó sang MyISAM như sau:

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;

Sau đó, bạn có thể để tệp này phát triển rất lớn và bạn sẽ phải thanh lọc bảng thường xuyên. Dưới đây là cách thanh lọc bảng general_log và giữ trong 3 ngày qua:

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;

Điều gì về syslog (var / log / message)? Bạn phải tự viết kịch bản đó. Đầu tiên, bạn cần cái này:

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

nếu bạn muốn thu thập nhật ký chung ở cả hai định dạng hoặc

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

chỉ cho định dạng tập tin.

Bây giờ tạo một tập lệnh để thu thập các thay đổi thành /var/log/general.log. Kịch bản sẽ trông rất giống như thế này:

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

Chạy kịch bản này mỗi phút. Tôi khuyên bạn nên cắt bớt nhật ký chung mỗi nửa đêm như thế này

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

Hãy thử một lần !!!


4

Trong /etc/my.cnf, đặt nó.

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

Sửa /etc/rsyslog.conf (RHEL / CentOS) tập tin, và cho phép mô-đun imfile để đọc /path/to/mysql/dir/mysql-general.log và sau đó, gửi nó tới máy chủ syslog từ xa, tôn trọng một khoảng thời gian cấu hình trong Tham số PollingInterval .

Phần này sẽ trông như thế này dưới đây:

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

Không phù hợp với WorkDirectory

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

Và cấu hình nó để gửi tất cả các bản ghi từ xa

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

Hoặc là

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

2
Bạn có thể muốn tránh chỉnh sửa /etc/rsyslog.conf và sử dụng tệp được tạo trong /etc/rsyslog.d để kiểm soát các điều chỉnh tùy chỉnh của bạn. Các tập tin thả vào bảo vệ việc kiểm tra các cấu hình distro liên quan đến nâng cấp và dễ dàng đóng gói và đồng bộ với các máy chủ khác. So sánh /etc/php.d, /etc/sysctl.d và /etc/security/limits.d.
dùng2066657
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.