この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
よく訓練されたアップル信者、都元です。本日は小ネタで。
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って強力ですねぇ。