読者です 読者をやめる 読者になる 読者になる

へっぽこびんぼう野郎のnewbie日記

けろけーろ(´・ω・`)!

pythonでログ出力するデコレータつくった

Python

loggingモジュールの勉強のためにつくった

なにするやつ

main.py

def hoge():
print("main_hoge!!")


if __name__ == '__main__':
hoge()

というのがあったら

main.py

import utils.loginit
from utils.log import logger


@logger
def hoge():
print("main_hoge!!")


if __name__ == '__main__':
hoge()

ってつけてあげるとログを取得できてプリントデバッグが捗る

つかいかた

$ python main.py -l INFO
-l INFOは別になくてもいいけど、WARNING用のデコレータをつくって、「これはWARNINGとして出したい」のように使い分けれる

loginitモジュールは1回だけ呼び出せばあとはなんとかしてくれる

ちなみにloggingのデフォルト値は

>>> logging.getLevelName(logging.getLogger().getEffectiveLevel())
'WARNING'

loggingのレベルについては以下の数字参照。高いほど危険。BASIC_FORMATと_STYLESは関係ないやつ。

>>>for attr in dir(logging):
... if attr.upper() == attr:
... print(attr, " : ", getattr(logging, attr))
...
BASIC_FORMAT : %(levelname)s:%(name)s:%(message)s
CRITICAL : 50
DEBUG : 10
ERROR : 40
FATAL : 50
INFO : 20
NOTSET : 0
WARN : 30
WARNING : 30
_STYLES : {'{': (, '{levelname}:{name}:{message}'), '$': (, '${levelname}:${name}:${message}'), '%': (, '%(levelname)s:%(name)s:%(message)s')}

なんか一覧あったけど、実際の動きとちょっと違う。公式ェ……
16.6. logging — Logging facility for Python — Python 3.4.3 documentation (英語)

ソース

loginit.py

import logging
import argparse


# create the parser
parser = argparse.ArgumentParser()


# set the parameter to the parser for getting an argument
parser.add_argument("--loglevel","-l", default="INFO", help="Set level of log message")


# parsing in it
args = parser.parse_args()


# assign the argument value to loglevel
loglevel = args.loglevel


# get the real number of logging.{loglevel} (e.g. logging.DEBUG, logging.INFO)
numeric_level = getattr(logging, loglevel.upper(), None)


# if parsing is failed, then raise an Error
if not isinstance(numeric_level, int):
raise ValueError('Invalid log level: %s' % loglevel)


# initial config for logging
logging.basicConfig(level=numeric_level)

log.py

import logging


# a kind of decorators (merely execute a function decorated statements of logging)
def logger(func):
def wrapper(*args, **kwargs):
logging.info(" '%s' function is working" % (func.__name__))
logging.info(' Starting')
func(*args, **kwargs)
logging.info(' Finishing')
return wrapper

ソース置き場

github.com
$ git clone git@github.com:harukaeru/logging_test.gitSSHの人用)