この行数の多いコードに少しだけ便利な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の指定やログレベルに関して説明がありますので、参照するのをおすすめします。

docs.python.org

今更だが背景

pythonで自作loggerを作られている方はいらっしゃるが、関数化されていなかったり、

yaml形式ではなく、一行一行setしている方が多かったため、自作をしようと思い立った。 

最後に

今回自作でloggerを作っていて思ったことは、意外と設定が面倒だなと思った。

各IT企業はloggerの作成はどうしているのだろう?会社基準とかあるのかな?と、ふと思ったが、意外とこういった知見共有はされないで終わるパターン多いよねと思う。

 

これからこのloggerをより使えるものにするために、下記を実施する予定だが、

もし「こういった機能が欲しい」「こういった指定がしたい」等あればコメントを貰えると嬉しいです。

  • ファイル名の指定がある場合はファイルにログを出力するが、指定がない場合はファイルへのログ出力は行わない
  • ファイルに出力するログと、sys.stderr(標準エラー)に出力するログレベルをそれそれ指定できるようにする

 

ユーザー定義例外クラスとかloggerとか作成してみると面白いよね。