PythonのLogging

単純なログ出力であればとくに書く必要もありませんが、少し複雑になるだけで、チュートリアルを読まないとわかないくらい煩雑です。しかも読んだだけだと今ひとつわからないというのがPythonのロギングです。

目的はBotのログ出力を、Bot自体の生死用、取引用と2つないし3つのログを取るためです。不具合を修正したり、取引内容を解析したりするのに、つねに張りついて監視しているわけではないので、ログだけが頼りです。それなので解析しやすいログ取りは必須条件です。

とりあえずloggingモジュールの使い方を検索して調べ、寄せ集めで作りました。これを基本にBotに組み込めば良いはずです。Botはいくつかパーツに分けてあるため定義したログオブジェクトを渡せばプログラム全体通してログがとれます。このテストプログラムではtest_log(super_logger)としてあります。

import logging
import time, calendar
import pytz
from datetime import datetime, date, tzinfo
from logger3 import test_log

timezone = 'Asia/Tokyo'

def customTime(*args):
    utc_dt = pytz.utc.localize(datetime.utcnow())
    tz = pytz.timezone(timezone)
    converted = utc_dt.astimezone(tz)
    return converted.timetuple()

logging.Formatter.converter = customTime
#formatter = logging.Formatter(fmt='%(asctime)s %(levelname)s %(message)s', datefmt='%Y-%m-%d %H:%M:%S')
formatter = logging.Formatter(fmt='%(asctime)s %(message)s', datefmt='%Y-%m-%d %H:%M:%S')

def setup_logger(name, log_file, level=logging.INFO):
    handler = logging.FileHandler(log_file)   
    handler.setFormatter(formatter)
    logger = logging.getLogger(name)
    logger.setLevel(level)
    logger.addHandler(handler)

    return logger

# first file logger
logger = setup_logger('first_logger', 'first_logfile.log')
logger.info('This is just info message')

# second file logger
super_logger = setup_logger('second_logger', 'second_logfile.log')
super_logger.error('This is an error message')

test_log(super_logger)

def another_method():
   # using logger defined above also works here
   logger.info('Inside method')