ようへいの日々精進XP

よかろうもん

小ネタ道場一本勝負 〜 Python Logging で CloudWatch Logs にログを送信したいんですけど 〜

たのもう

Python の Logging モジュールで CloudWatch Logs にログを転送出来るやつ(ハンドラ)があればいいのになーと思っていたら既に在ったので嬉しかったです。

github.com

一本

watchtower のインストール

pip install watchtower

サンプル

import watchtower, logging
import boto3

session = boto3.Session(profile_name='your-profile')

logging.basicConfig(level=logging.WARN)
logger = logging.getLogger(__name__)
logger.addHandler(watchtower.CloudWatchLogHandler(
    boto3_session=session,
    log_group='your-log-group',
    stream_name='your-log-stream')
)
logger.info(dict(level="info", details={"foo":"info"}))
logger.warn(dict(level="warn", details={"foo":"warn"}))
logger.error(dict(level="error", details={"foo":"error"}))

サンプルを実行

$ python --version
Python 3.6.0
$ python log_test.py
WARNING:__main__:{'level': 'warn', 'details': {'foo': 'warn'}}
ERROR:__main__:{'level': 'error', 'details': {'foo': 'error'}}

CloudWatch Logs を確認してみます。

$ aws --profile your-profile --region ap-northeast-1 logs get-log-events \
  --log-group-name your-log-group \
  --log-stream-name your-log-stream \
  | jq '.events|sort_by(.timestamp)|.[-2,0]'
{
  "ingestionTime": 1490399839605,
  "timestamp": 1490399841112,
  "message": "{'level': 'warn', 'details': {'foo': 'warn'}}"
}
{
  "ingestionTime": 1490399839605,
  "timestamp": 1490399841619,
  "message": "{'level': 'error', 'details': {'foo': 'error'}}"
}

有難うございました

github.com