PythonでログをCloudWatchに出力する「Watchtower」
はじめに
最近はPythonを触ることが多い、t.hondaです。AWSのサービスはログをCloudWatchに出力することが多いですが、EC2上で実行するプログラムのログもCloudWatchに出力し、全てのログがCloudWatchに集約化させたいケースがありました。(とはいえ通信エラーなどCloudWatchに届かないケースもあるので、最終的にはローカルに吐くログも必要かとは思いますが・・・)
今回はPythonのプログラムよりログをCloudWatchに出力するWatchtowerを紹介したいと思います。
導入方法について
先に挙げたサイトにも使用方法、サンプルソースは書いてあるのですが、私が書いたソースも載せておきます。
1.インストール
pipを使用し、以下のコマンドを実行します。これは公式サイトと同じです。
$ pip install watchtower
2.ログ出力
Watchtowerを使用し、CloudWatchのログを出力するパッケージを作成しました。公式サイトと同じ方法でも可能でしたが、ログの内容に現在日時を付与して出力したかったためです。以下のようになりました。
util/logger.py
import datetime import watchtower, logging logging.basicConfig(level=logging.INFO) _logger = logging.getLogger('sample_logger') _logger.addHandler(watchtower.CloudWatchLogHandler()) def info(message): _logger.info('[%s] %s' % (current_datetime(), message)) def error(message): _logger.error('[%s] %s' % (current_datetime(), message)) def current_datetime(): return datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S')
ログの出力先をアプリケーションで1つとするため、5行目では固定値で名称を指定しています(公式サイトではプログラム名となっているようです)。それと12行目では「.error()」も使用できるかも試してみました。結果としては.error()を用いてもCloudWatchに出力されるのですが、メッセージの内容からinfo/errorの区別はできないようです。
これを使用したログの出力部は以下のようになります。
#!/usr/bin/env python # -*- coding: utf-8 -*- import traceback from util import logger def main(): try: logger.info('sample start.') # なんらかの処理 logger.info('sample end.') except Exception as e: logger.error(traceback.format_exc()) logger.error(e) if __name__ == '__main__': main()
まとめ
以上、簡単ですがPythonからCloudWatchにログを出力する方法についてでした。Pythonを使用する際に何かの役に立てば幸いです。