syslog에 MySQL 로그를 어떻게 출력합니까?


13

우분투 (10.04 LTS)에서 MySQL (5.1.41)을 로깅하기 위해 syslog를 사용하고 싶습니다. syslog에 오류 로그를 출력하는 정보를 찾았습니다.

[mysqld_safe]
syslog

그러나 일반 로그 및 느린 쿼리 로그를 로깅하는 데 syslog를 사용하고 싶습니다. 구성 파일을 작성하는 방법을 알려주십시오.

참조 매뉴얼에서 방법을 찾을 수 없습니다.

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


많은 사람들이이 질문을했다고 확신합니다. 따라서이 질문을 공개적으로 공개하면 +1을받습니다.
RolandoMySQLDBA

주의 : 5.7.5에서 맞춤법이로 변경 될 수 있습니다 log_syslog.
Rick James

답변:


12

이것은 훨씬 간단하게 이런 식으로 수행됩니다.

mysql 폴더로 cd :

mkfifo mysql-general.log

my.cnf에서 다음과 같이 말합니다.

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

그런 다음 FIFO 파이프를 읽고 원하는대로 syslog / syslog-ng를 구성하십시오.

내 경우에는 오류 로그와 느린 쿼리 로그 만 사용하여 네트워크를 통해 중앙 서버로 파이프합니다.

로컬 사본도 유지하려는 경우 위에서 설명한대로 테이블 및 파일로 출력하도록 설정하십시오.


그 방법은 흥미 롭습니다. 모든 것과 할머니가 일반 통나무에 착륙하기 때문에 급류에 대비하여 네트워크를 준비해야합니다. 이것은 모든 명령과 로그인하는 모든 사용자 ID를 엄격하게 검사하는 엔터프라이즈 설치에 적합합니다. 이것은 +1입니다 !!!
RolandoMySQLDBA

3
fifo는 또한 작성되지 않은 청취 프로그램을 동결시키는 경향이 있습니다. 따라서 MySQL이이 fifo에 대한 쓰기를 중지하면 syslog도 중지 될 수 있습니다.
Stefan Lasiewski

4

이 메커니즘은 OS syslog와 완전히 다릅니다.

로그 출력 설정은 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

이 스크립트를 1 분마다 실행하십시오. 이런 식으로 자정마다 일반 로그를 자르는 것이 좋습니다.

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를 비교하십시오.
user2066657
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.