如何将MySQL日志输出到syslog?


13

我想使用syslog在Ubuntu(10.04 LTS)上记录MySQL(5.1.41)。我发现了将错误日志输出到syslog的信息。

[mysqld_safe]
syslog

但是我想使用syslog记录常规日志和慢查询日志。请告诉我如何写配置文件?

我在参考手册中找不到该怎么做。

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


我相信很多人都问过这个问题。因此,您获得+1以公开显示此问题。
RolandoMySQLDBA 2011年

注意:5.7.5可能会将拼写更改为log_syslog
瑞克·詹姆斯

Answers:


12

这样更简单:

cd到mysql文件夹:

mkfifo mysql-general.log

在my.cnf中告诉它:

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

然后,配置您的syslog / syslog-ng以读取FIFO管道并按其进行操作。

就我而言,我将其通过网络通过管道传输到仅包含错误日志和慢查询日志的集中式服务器。

在您还希望保留本地副本的情况下,只需如上所述将其设置为输出到表和文件即可。


这种方法听起来很有趣。一个人必须为流量洪流做好准备,因为一切及其祖母都落在了普通日志中。这肯定适合企业安装,它严格检查每个登录的命令和每个用户ID。这是+1!
RolandoMySQLDBA 2011年

3
不幸的是,fifo也倾向于冻结所有未编写的监听程序。因此,如果MySQL停止写入此fifo,则syslog也可能停止。
Stefan Lasiewski 2013年

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;

那么系统日志(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")

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 '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.