この記事は
- ECSとCloudwatch logsでRailsを運用する場合のメモです
やりたいこと
- ECSからCloudwatch Logsに対してRailsのログを出力します
- Cloudwatch Logsに記録されたログは最低限tailしたり、エディタで参照したり、grepしたり、従来通りのログ調査だとかができるようにしたいです
ECSの設定
- 事前にCloudwatch Logsのgroupを作成しておきます
- ECSからCloudwatch Logsにログを送出する設定を入れます
- 具体的にはECSのタスク定義のところに下記のように書きます
{
...
"containerDefinitions": [
{
...
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "xxx-log",
"awslogs-region": "ap-northeast-1"
}
...
},
- この設定により、Dockerコンテナが標準出力した内容がそのままCloudwatch Logsに出力されるようになります
Railsの設定
- Railsのログ出力はデフォルトではファイル出力になります
- これを標準出力するように設定します
config/environments/production.rb
config.logger = Logger.new(STDOUT)
awslogsの導入
awslogs?
- 上記の内容をデプロイすることで、Cloudwatch LogsにRailsのログが出るようになりますが、そのままだと、切り刻まれたファイルをブラウザからダウンロードする地獄を見る羽目になります
- クライアント側にawslogsというcliツールを入れることで、普通にtailぽい感じとか、lessでみたりとかできるようになります
awslogsのインストール
- 事前にaws-cliは入れて
aws configure
しておきます - その上で下記の感じでpipでインストールします
pip install awslogs
awslogsの使い方
tailっぽく
- tailぽく使いたい場合は下記のようにします
-
xxx-log
: ロググループ名 -
--aws-region
: リージョン名 -
-w
: tailっぽく表示 -
-S
: ストリーム情報を表示しない
-
awslogs get xxx-log --aws-region=ap-northeast-1 -w -S
エディタで見る
- エディタで見たい場合は
-w
を取って下記のようにします-
--start
: ログの開始時間(これ以降のログを表示)
-
awslogs get xxx-log --aws-region=ap-northeast-1 -S --start='1 hour' | less
- これで普通にlessで見れます
- ちなみに
--start
指定はpythonのdateutilというライブラリの記法らしいです
grepかける
- 上のエディタのケースのlessをgrepにするだけです
awslogs get xxx-log --aws-region=ap-northeast-1 -S --start='1 hour' | grep 'xxx'
終わりに
- これで何かあっても従来の方法で調査できますね
参考