Docker MySQLイメージのクエリログ(General Query Log)出力

mysql Repository | Docker Hub Registry – Repositories of Docker Imagesのクエリログを見る方法

方法1.クエリログをファイル出力して、ログディレクトリをデータボリュームでマウント

  1. log.cnf(クエリログを出力するように設定したMySQLの設定ファイル)とDockerfileを作成する

    log.cnf

    [mysqld]
    log_output=FILE
    general_log=1
    general_log_file=/var/log/mysql/query.log
    

    Dockerfile

    FROM mysql
    ADD log.cnf /etc/mysql/conf.d/log.cnf
    RUN chmod 644 /etc/mysql/conf.d/log.cnf
    
  2. ビルド
    $ docker build -t mysql_custom .
    
  3. ログディレクトリを作成
    $ mkdir mysqllog
    
  4. Docker側のMySQLが書き込みできるように権限を与える
    $ chmod 777 mysqllog
    
  5. Docker実行
    $ docker run -e MYSQL_ROOT_PASSWORD=my-secret-pw -v `pwd`/mysqllog:/var/log/mysql -p "3306:3306" -d mysql_custom
    
  6. クエリログの参照
    $ sudo tail -f mysqllog/query.log
    
  7. 上記出力したまま、別端末でMySQLサーバにログインしてクエリを発行し、記録していることを確認
    $ MYSQL_PWD=my-secret-pw mysql -u root -h 127.0.0.1 -P 3306
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    +--------------------+
    3 rows in set (0.00 sec)
    
    150729 12:02:11     6 Connect   root@172.17.42.1 on
                        6 Query     select @@version_comment limit 1
    150729 12:02:12     6 Query     show databases
    150729 12:02:14     6 Quit
    

Dockerfileを使わない方法

mysqlイメージは、/etc/mysql/conf.dに追加の設定ファイルを入れておけば、起動時に読み込む仕組みのため、docker run 時にマウントすることでDockerfileを省略できる。

設定ファイルを保存するディレクトリを作り、先ほどのlog.cnfを移動する。

mkdir mysqlconf
mv log.cnf mysqlconf/

/etc/mysql/conf.dにマウントさせて起動させる。

docker run -e MYSQL_ROOT_PASSWORD=my-secret-pw -v `pwd`/mysqllog:/var/log/mysql -v `pwd`/mysqlconf:/etc/mysql/conf.d -p "3306:3306" -d mysql

方法2.クエリログの出力先を標準出力にする

kolypto/docker-mysqlを参考に

log.cnfを以下のようにする

[mysqld]
log_output=FILE
general_log=1
general_log_file=/dev/stdout

起動する

docker run -e MYSQL_ROOT_PASSWORD=my-secret-pw -v `pwd`/mysqlconf:/etc/mysql/conf.d -p "3306:3306"  mysql

しかし、起動中に

[ERROR] Could not open /dev/stdout for logging (error 2). Turning logging off for the whole duration of the MySQL server process. To turn it on again: fix the cause, shutdown the MySQL server and restart it.

となり、クエリログは出力されませんでした。

Dockerのバージョンは

$ docker --version
Docker version 1.7.1, build 786b29d

docker execで実行中のMySQLイメージに入り、コマンドラインで書き込みをテストしてみる。

$ docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                    NAMES
bf5335a829bf        mysql               "/entrypoint.sh mysq   25 seconds ago      Up 24 seconds       0.0.0.0:3306->3306/tcp   boring_engelbart
$ docker exec -it bf5335a829bf bash
root@bf5335a829bf:/# apt-get update
root@bf5335a829bf:/# apt-get install -y sudo
root@bf5335a829bf:/# sudo -u mysql sh -c "echo test > /dev/stdout"
sh: 1: cannot create /dev/stdout: Permission denied

/dev/stdoutの権限を確認する。

root@bf5335a829bf:/# ls -l /dev/stdout
lrwxrwxrwx 1 root root 15 Jul 30 04:04 /dev/stdout -> /proc/self/fd/1
root@bf5335a829bf:/# ls -l /proc/self/fd/1
lrwx------ 1 root root 64 Jul 30 04:12 /proc/self/fd/1 -> /dev/pts/4
root@bf5335a829bf:/# ls -l /dev/pts/
total 0
crw-rw-rw- 1 root root 5, 2 Jul 30 04:04 ptmx

/dev/stderrも同様で、以下のissueが出ています。
Permission denied on /dev/stderr · Issue #6880 · docker/docker

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中