PythonでログをCloudWatchに出力する「Watchtower」

2016.08.10

この記事は公開されてから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を使用する際に何かの役に立てば幸いです。