読者です 読者をやめる 読者になる 読者になる

slowlogを毎日メールで送る

MySQL

ちょっと自信がないが、logrotateのprerotateの中に書けばcronで行う必要はないと思う。

/var/log/mysqld.log /var/log/mysqld-slow.log {
        # create 600 mysql mysql
        notifempty
        daily
        rotate 3
        missingok
        compress
        sharedscripts
    prerotate
        /usr/bin/mysqldumpslow -s t /var/log/mysqld-slow.log 2>/dev/null | \
        mail -s "slowlog" foo@example.com
    endscript
    postrotate
        # just if mysqld is really running
        if test -x /usr/bin/mysqladmin && \
           /usr/bin/mysqladmin ping &>/dev/null
        then
           /usr/bin/mysqladmin flush-logs
        fi
    endscript
}

postrotateはログローテートが行われた後で実行されるので、postrotateが実行されるタイミングでは/var/log/mysqld-slow.logは存在しないかもしれない。そのため、prerotateでログローテートが実行される前にmysqldumpslowを実行するようにする。

あと、上記のように複数のファイルをローテートの対象にすると、そのままでは、prerotate/postrotate共に、ローテートが行われたファイルの数だけ実行されてしまう(上の例だと2通メールが送られてしまう)。なので、sharedscriptsオプションを使って一度だけしか実行されないことを保証する。

mysqldumpslowは標準出力に解析結果を、標準エラーに、

Reading mysql slow query log from /var/log/mysqld-slow.log

という出力を行うようなので、標準エラーの方は2>/dev/nullで捨てている。

もし、mysqldumpslowをかけるという要件がないならば、

/var/log/mysqld.log /var/log/mysqld-slow.log {
# 省略
    mail foo@example.com
    mailfirst
# 省略
}

のように、mailオプションとmailfirstオプションを使えば、ローテートされるファイルそのものを(compressオプションを指定していても未圧縮のファイルを)メールで受け取れる。

アルファインフラエンジニアが「この状態で mysqldumpslow した結果を毎日メールで送ると便利かもしれません。」としか書いていないので、logrotateだけでやる方法はちょっと調べた。