この行数の多いコードに少しだけ便利なloggingを!
この行数に多いコードに少しだけ便利なloggingを!
今回実施したこと
pythonにて、ログレベルとファイル名を指定することで、
任意のログレベルに対応し、ログファイルにも記載してくれるコードを作成、関数化した。
なお、ログ設定にはyaml形式を採用した。
コード
まずはコード全行を記載。
>|python3|
# import
import yaml
from logging import config, getLogger
def my_logger(level = 'DEBUG', filename = None):
logger = getLogger(__name__)
# set config by yaml
conf = """
version: 1
formatters:
default:
format: '%(asctime)s %(levelname)s : %(message)s'
datefmt: '%Y/%m/%d %I:%M:%S'
handlers:
streamHandler:
class: logging.StreamHandler
level: {0}
formatter: default
stream: ext://sys.stdout
fileHandler:
class: logging.FileHandler
level: {0}
formatter: default
filename: {1}
loggers:
myLogger:
level: {0}
handlers: [streamHandler, fileHandler]
propagate: no
root:
level: {0}
handlers: [streamHandler, fileHandler]
disable_existing_loggers: False
"""
config.dictConfig(yaml.load(conf.format(level, filename), Loader=yaml.SafeLoader))
return logger
||<
使用方法は簡潔に、
- level: loggingしたいログレベルを記載。defaultは'DEBUG'にしている。
- filename: ログ出力をしたいファイル名を記載。ディレクトリは事前に準備すること。ファイルは自動で生成する。
出力結果
>|python3|
# 実行
## 関数を使用して設定
logger = my_logger(level = 'INFO', filename = './log/test.log')
## 出力
logger.debug('debug')
logger.info('info')
logger.warning('warning')
logger.error('error')
logger.critical('critical')
# 出力結果 ログレベルを'INFO'にしたので、DEBUGは出力されない
2021/02/25 09:10:09 INFO : info
2021/02/25 09:10:09 WARNING : warning
2021/02/25 09:10:09 ERROR : error
2021/02/25 09:10:09 CRITICAL : critical
||<
カスタマイズしたい場合
- format: ログ出力のフォーマットを指定できるため、いろいろなフォーマットを試すといいかも。
下記サイトにformatterの指定やログレベルに関して説明がありますので、参照するのをおすすめします。
今更だが背景
pythonで自作loggerを作られている方はいらっしゃるが、関数化されていなかったり、
yaml形式ではなく、一行一行setしている方が多かったため、自作をしようと思い立った。
最後に
今回自作でloggerを作っていて思ったことは、意外と設定が面倒だなと思った。
各IT企業はloggerの作成はどうしているのだろう?会社基準とかあるのかな?と、ふと思ったが、意外とこういった知見共有はされないで終わるパターン多いよねと思う。
これからこのloggerをより使えるものにするために、下記を実施する予定だが、
もし「こういった機能が欲しい」「こういった指定がしたい」等あればコメントを貰えると嬉しいです。
- ファイル名の指定がある場合はファイルにログを出力するが、指定がない場合はファイルへのログ出力は行わない
- ファイルに出力するログと、sys.stderr(標準エラー)に出力するログレベルをそれそれ指定できるようにする
ユーザー定義例外クラスとかloggerとか作成してみると面白いよね。