awscliでRDSのログを見る
よく訓練されたアップル信者、都元です。本日は小ネタで。
RDSのログ参照API
RDS for MySQLでは、DBParameterGroupに設定を行うことにより、slow query log や general log を参照できるようになることが知られています *1。
このログファイルは、API経由で参照できます。具体的には、DescribeDBLogFilesアクションによって今存在するログファイルの名前・サイズ・最終更新タイムスタンプを確認し、DownloadDBLogFilePortionアクションでファイルの内容を参照できます。
awscliでログ参照
awscliにおいては、下記のようなコマンドでDescribeDBLogFilesアクションを実行可能です。
$ aws rds describe-db-log-files --db-instance-identifier xxxx { "DescribeDBLogFiles": [ { "LastWritten": 1398999600000, "LogFileName": "error/mysql-error.log", "Size": 0 }, { "LastWritten": 1398999899000, "LogFileName": "general/mysql-general.log", "Size": 110709 }, { "LastWritten": 1398999600000, "LogFileName": "general/mysql-general.log.3", "Size": 264104 }, { "LastWritten": 1398999600000, "LogFileName": "slowquery/mysql-slowquery.log", "Size": 183 }, { "LastWritten": 1398999300000, "LogFileName": "slowquery/mysql-slowquery.log.3", "Size": 1281 } ] }
ファイルが大量にある場合はこのままでは見づらいので、jqで整形しましょう。1ファイル1行で、そこそこ見やすくなりました。
$ aws rds describe-db-log-files --db-instance-identifier xxxx | jq -c ".DescribeDBLogFiles[]"{"Size":0,"LogFileName":"error/mysql-error.log","LastWritten":1398999600000} {"Size":106323,"LogFileName":"general/mysql-general.log","LastWritten":1398999855000} {"Size":264104,"LogFileName":"general/mysql-general.log.3","LastWritten":1398999600000} {"Size":183,"LogFileName":"slowquery/mysql-slowquery.log","LastWritten":1398999600000} {"Size":1281,"LogFileName":"slowquery/mysql-slowquery.log.3","LastWritten":1398999300000}
さて、DownloadDBLogFilePortionアクションはというと…。
$ aws rds download-db-log-file-portion --db-instance-identifier xxxx --log-file-name general/mysql-general.log { "LogFileData": [ "/", "r", "d", "s", "d", "b", "b", "i", "n", "/", "m", "y", "s", "q", "l", "/", "b", "i",
思わず目を疑いました。 / ... r ... d ... s ... d ... b ... b ... i ... n ... って1文字ずつかよw
よろしい、ならばjqで整形だ
でも大丈夫。jqは非常に優秀です。addという関数で一発結合!
$ aws rds download-db-log-file-portion --db-instance-identifier xxxx --log-file-name general/mysql-general.log | jq ".LogFileData | add" "/rdsdbbin/mysql/bin/mysqld, Version: 5.6.13-log (MySQL Community Server (GPL)). started with:\nTcp port: 3306 Unix socket: /tmp/mysql.sock\n(略)
うーん、改行コードが\nで表現されているため、全体が1行で出ちゃいました。そこでraw-outputオプション-rを使うと…。
$ aws rds download-db-log-file-portion --db-instance-identifier xxxx --log-file-name general/mysql-general.log | jq -r ".LogFileData | add" /rdsdbbin/mysql/bin/mysqld, Version: 5.6.13-log (MySQL Community Server (GPL)). started with: Tcp port: 3306 Unix socket: /tmp/mysql.sock Time Id Command Argument 21943 Query select @@session.tx_read_only 21943 Query SELECT 1 21943 Query select @@session.tx_read_only 21943 Query select name from mysql.plugin 21943 Query select @@session.tx_read_only 21943 Query SELECT 1 21943 Query select @@session.tx_read_only
欲しい結果が得られました。いやーー、jqって強力ですねぇ。