eXcale開発チームの平井です。
eXcale では、その裏側の仕組みで、サーバのセットアップやアプリケーションのデプロイ処理にCapistranoを使っています。
今回は、Capistrano 2系でのログレベル変更方法と変更による違いをご紹介します。ログレベルを指定することで、出力情報を制御することができます。
>>eXcaleは期間限定でサインアップキャンペーン実施中!気になる内容はこちら<<
前準備
ここでは、Capistranoそのものの説明はしません。Capistranoそのものに関しては、eXcaleチームの西谷が寄稿した『特集 DevOps時代の必須知識:まとめてたくさん処理したい! を解決する「Capistrano」 – @IT』などの情報をご参照ください。また、Capistranoの最新版は3系ですが、本記事では2系を対象としています。
Capistrano実行時のログを確認するためのコードとして以下を使用します。
コードの内容としては、localhostに対して、lsコマンドを実行しています。
exec_ls_succタスクはコマンド成功時、exec_ls_failタスクはコマンド失敗時のログを確認するために用意しています。
そのため、以下を実行する際は、事前にファイル( /tmp/foo/bar )を成しておく必要がります。
また、username、passwordは実行時の環境に併せて変更してください。
Capistrano v2.15.5で実行を確認しています。
1 2 3 4 5 6 7 8 9 10 11 12 |
set :user, 'username' set :password, 'password' role :local, 'localhost' task :exec_ls_succ, :roles => :local do run 'ls /tmp/foo/bar' end task :exec_ls_fail, :roles => :local do run 'ls /tmp/foo/baz' end |
ログレベル指定なしでの実行
特にログレベルを指定しない状態で実行すると以下のようになります。
それぞれ、lsコマンドを実行して、一方は成功、もう一方は失敗していることがわかります。
また、その実行しているタスク名や実行対象のサーバ、実行したコマンド、コマンドの出力結果、実行時間も確認することができます。
- exec_ls_succ実行結果
1 2 3 4 5 6 7 8 |
% cap -f check_logger.cap exec_ls_succ * 2014-02-25 10:01:01 executing `exec_ls_succ' * executing "ls /tmp/foo/bar" servers: ["localhost"] [localhost] executing command ** [out :: localhost] /tmp/foo/bar command finished in 293ms |
- exec_ls_fail実行結果
1 2 3 4 5 6 7 8 9 |
% cap -f check_logger.cap exec_ls_fail * 2014-02-25 10:01:24 executing `exec_ls_fail' * executing "ls /tmp/foo/baz" servers: ["localhost"] [localhost] executing command *** [err :: localhost] ls: /tmp/foo/baz: No such file or directory command finished in 247ms failed: "sh -c 'ls /tmp/foo/baz'" on localhost |
ログレベルの指定
では、次にログレベルを変更した形で実行してみます。
ログレベルを指定するように変更したコードは以下になります。
ログレベルは、logger.level = Logger::DEBUG のように指定します。
Capistrano2系では、TRACE、DEBUG、INFO、IMPORTANTを指定することが出来ます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
set :user, 'username' set :password, 'password' role :local, 'localhost' logger.level = Logger::DEBUG # TRACE # DEBUG # INFO # IMPORTANT task :exec_ls_succ, :roles => :local do run 'ls /tmp/foo/bar' end task :exec_ls_fail, :roles => :local do run 'ls /tmp/foo/baz' end |
TRACE指定での実行
ログレベルを指定していなかった場合と同じ出力となります。
- exec_ls_succ実行結果
1 2 3 4 5 6 7 8 |
% cap -f check_logger.cap exec_ls_succ * 2014-02-25 10:15:04 executing `exec_ls_succ' * executing "ls /tmp/foo/bar" servers: ["localhost"] [localhost] executing command ** [out :: localhost] /tmp/foo/bar command finished in 297ms |
- exec_ls_fail実行結果
1 2 3 4 5 6 7 8 9 |
% cap -f check_logger.cap exec_ls_fail * 2014-02-25 10:15:08 executing `exec_ls_fail' * executing "ls /tmp/foo/baz" servers: ["localhost"] [localhost] executing command *** [err :: localhost] ls: /tmp/foo/baz: No such file or directory command finished in 237ms failed: "sh -c 'ls /tmp/foo/baz'" on localhost |
DEBUG指定での実行
TRACEに比べ、実行対象のサーバ、実行時間の情報がなくなっています。
- exec_ls_succ実行結果
1 2 3 4 5 |
% cap -f check_logger.cap exec_ls_succ * 2014-02-25 10:15:17 executing `exec_ls_succ' * executing "ls /tmp/foo/bar" ** [out :: localhost] /tmp/foo/bar |
- exec_ls_fail実行結果
1 2 3 4 5 6 |
% cap -f check_logger.cap exec_ls_fail * 2014-02-25 10:15:21 executing `exec_ls_fail' * executing "ls /tmp/foo/baz" *** [err :: localhost] ls: /tmp/foo/baz: No such file or directory failed: "sh -c 'ls /tmp/foo/baz'" on localhost |
INFO指定での実行
DEBUGに比べ、実行するタスク名、実行したコマンドの情報がなくなっています。
- exec_ls_succ実行結果
1 2 3 |
% cap -f check_logger.cap exec_ls_succ ** [out :: localhost] /tmp/foo/bar |
- exec_ls_fail実行結果
1 2 3 4 |
% cap -f check_logger.cap exec_ls_fail *** [err :: localhost] ls: /tmp/foo/baz: No such file or directory failed: "sh -c 'ls /tmp/foo/baz'" on localhost |
IMPORTANT指定での実行
INFOに比べ、コマンド成功時の出力結果の情報がなくなっています。
(exec_ls_succタスクは成功しているので出力がないです)
- exec_ls_succ実行結果
1 |
% cap -f check_logger.cap exec_ls_succ |
- exec_ls_fail実行結果
1 2 3 4 |
% cap -f check_logger.cap exec_ls_fail *** [err :: localhost] ls: /tmp/foo/baz: No such file or directory failed: "sh -c 'ls /tmp/foo/baz'" on localhost |
最後に
このように、ログレベルを指定することで、出力情報を制御することができます。
また、出力されているログの先頭に表示される*の数がログレベルと関係していることがわかります。(IMPORTANTは*が0個、INFOは1個、DEBUGは2個、TRACEは3個)
次回はログの出力フォーマットのカスタマイズについてご紹介したいと思います。