DockerコンテナでRailsとかを運用していると気になるのがログの管理。何らかの理由でコンテナが正常に起動しなかったり、障害時に原因を探るためにログを見たい…という時にいちいちDockerコンテナに入ってログを確認するの面倒です。なので、papertrailというサービスを利用しています。
これは複数のサーバやコンテナのログを一つに集約して tail
コマンドのようにログファイルを閲覧できるいい感じのサービスです。似たようなものとして最近出た logDNA というのもあります。ほぼ同じような機能です。
AWS ECSの設定
papertrailのタスク定義
ログには /var/run/docker.sock
を利用するので、最初にボリュームを作成しておきます。
項目 | 内容 |
---|---|
ボリューム名名前 | dockersock(自由に) |
ソースパス | /var/run/docker.sock |
公式でDockerイメージがあるのでそれを利用します。
項目 | 内容 |
---|---|
コンテナ名 | papertrail(自由に) |
イメージ | gliderlabs/logspout |
メモリ制限 | ハード(128MB) |
ポートマッピング | なし |
CPUユニット数 | 100 |
コマンド | syslog://logs00.papertrailapp.com:000000(papertrailで発行されたアドレス) |
マウントポイント | 先程作った dockersock |
コンテナパス | /var/run/docker.sock |
タスク定義は以上です。
デプロイ
あとは稼働しているクラスタにpapertrailのタスクを実行します。「クラスター」→「タスク」→「新しいタスクの実行」でOKです。追加後は、以下のような感じになっていると思います。
Railsの設定
次にpapertailで収集したいログの出力先をアプリケーション側で設定します。今回はRailsを例にします。
config/enviroments/production.rb
各環境設定ファイルに以下のような感じで書くことでログが標準出力になります。
logger = ActiveSupport::Logger.new(STDOUT)
logger.formatter = config.log_formatter
config.log_tags = [:subdomain, :uuid]
config.logger = ActiveSupport::TaggedLogging.new(logger)
これでアプリケーション側の設定は完了です。
たぶんこんな感じでログが流れてきます。検索も色々できるので捗ると思います。
papertrailからS3へ
papertrailは基本的にテンポラリ的な使い方になります。 tail
がメイン。なのでログファイルの永続化は別に考える必要があります。幸いにもpapertrail(logDNAも)にはS3に転送する機能があります。
設定は簡単で、バケット名を設定して、papertrailのIAMアカウントを書き込み許可権限を与えるだけで1日1回ローテーションファイルを配置してくれます。
ただし、papertrailに送った全てのログが1つのファイルにマージして保存されるので、複数サービスを運用している場合は全部混ざってしまいます。後から解析する場合は、自前でフィルタするようにしなくてはならないのが微妙な所ですね…。
なので綺麗にログの永続化をしたいならfluentd→S3のような形を別途作ってあげたほうが良いかもしれません🤔