Python3

引数でlogging のレベルを変更する(Python)

More than 1 year has passed since last update.

本日は

いつまでもプリントデバッグしているとかっこ悪いのでログの取得の勉強をしています。その時のコードの練習

logging チュートリアルにて

基本 logging チュートリアル

を眺めていて

ロギングレベルをコマンドラインオプションから次のように設定したいなら:

--log=INFO

--log に渡されたパラメタの値をある変数 loglevel に保存すれば:

getattr(logging, loglevel.upper())

を使い、 level 引数を通して basicConfig() に渡すべき値を得られます。

の意味が分からなかったので自分なりに実装してみました。 
神はおっしゃった。引数は argparse で渡せと。

実装例

#setloglv.py
import logging
import argparse

# assuming loglevel is bound to the string value obtained from the
# command line argument. Convert to upper case to allow the user to
# specify --log=DEBUG or --log=debug
LOG_LEVEL = ['DEBUG', 'INFO', 'WARN', 'ERROR', 'CRITICAL']
USER_CHOICE = LOG_LEVEL+list(map(lambda w: w.lower(), LOG_LEVEL))


def set_parser_args(parser):
    parser.add_argument("--log", help='set log level',
                        choices=USER_CHOICE,
                        default="WARN")


def parse_arguments():
    parser = argparse.ArgumentParser()
    set_parser_args(parser)
    return parser.parse_args()


def main():
    args = parse_arguments()
    # parse log level
    numeric_level = getattr(logging, args.log.upper(), None)
    if not isinstance(numeric_level, int):
        raise ValueError('Invalid log level: %s' % loglevel)
    logging.basicConfig(level=numeric_level)

    logger = logging.getLogger(__name__)
    # code
    logger.debug('debug message')
    logger.info('info message')
    logger.warn('warn message')
    logger.error('error message')
    logger.critical('critical message')

if __name__ == '__main__':
    main()

実行例

(Windows 10 Pro, Python3)

$ python setloglv.py --log info
INFO:__main__:info message
WARNING:__main__:warn message
ERROR:__main__:error message
CRITICAL:__main__:critical message
$ python setloglv.py --log DEBUG
DEBUG:__main__:debug message
INFO:__main__:info message
WARNING:__main__:warn message
ERROR:__main__:error message
CRITICAL:__main__:critical message