この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
最近は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を使用する際に何かの役に立てば幸いです。