この行数の多いコードに少しだけ便利な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とか作成してみると面白いよね。

 

自己紹介も兼ねた初投稿

はじめに

「社会人になったら、自分で学んだ内容をメモ程度にも残しておこう!」と思い立ち、はや1年以上が過ぎた。。。

しかし、何もしないまま2021年を迎えるのはよろしくないと思い、アカウントを作成してみました。

初めての投稿のため、簡単に自己紹介や興味のあること、これからのことを記載してみようと思います。

 

自己紹介

好きな飲物は上島珈琲のメロンソーダで、食べ物はカレーうどん

ゲームは好きだし、運動も好き。インドア派ではあるもののアウトドアもある程度好きな、どこにでもいそうな外資系コンサルで働く社会人2年目のエンジニアです。

 

興味あること

  • 心理学(犯罪・臨床・教育etc.)
  • 食品
  • プログラミング技術

上記の項目を中心にブログを作成していこうと思います。

 

これから

興味がある項目の内容を気ままに記載・投稿していく予定です。

そもそもブログを始めようと思ったきっかけは、将来的には講師の仕事をしたいなと思っており、そのためのトレーニングも兼ねています。

ただせっかく、ブログという不特定多数の目にも触れるものであるため、目的は先にも述べたとおり、自分へのメモが主体ですが、丁寧に記載していこうと思います。

たまたま検索して、たまたま閲覧して頂いて、私の記載した内容が誰かの興味を引いたり、助けになれれば喜ばしいです。

 

よろしくお願いします。

 

独り言

次に投稿するときはちゃんと目次を使いましょうね。