BETA

結局Pythonのログってどうすればいいの?となった人へ

投稿日:2020-05-16
最終更新:2020-05-16

Pythonのloggingに関しては情報が多くて(色々な意見があり)、結局どうすればよいのかわからない人がいる気がしたので、簡単な使い方を書いておきます。

設定

main.pyというスクリプトからmodule.pyの関数を呼び出すことを考えます。module.pyの関数を呼び出したらログを出すように変更したいとします。

main.py

import module  

module.hoge()  

module.py

def hoge():  
    pass  

最もシンプルなロギング

最も簡単にログを出す方法は以下の通りです。

main.py

import logging  
import module  

# loggingをimportしたうえで次の2行を追加  
logging.basicConfig(level=logging.INFO)  
logger = logging.getLogger("hoge app")  
module.hoge()  

basicConfigはログに関する設定をおこないますが、これはmain.pyだけでやればOKです。呼び出されたモジュール(例えば次のmodule.py)内でのloggingにも設定が反映されます。

module.py

import logging  

# loggingをimportしたうえで次の行を追加  
logger = logging.getLogger(__name__)  

def hoge():  
    # logの表示  
    logger.info("モジュールの中だよ")  

実行すると以下のようになります。

$ python main.py  
INFO:module:モジュールの中だよ  

loggingのレベル

Errorに関するログやWarningに関するログを出すときはlogger.infoをlogger.errorやlogger.warningに変えれば良いです。実際、logger.infoをlogger.errorに変えると以下のようにERRORと表示されます。

$ python main.py  
ERROR:module:モジュールの中だよ  

またError、Warning、Info以外にもDebugの表示も出すことができます。ただし上記のmain.pyのままではlogging.infoをlogging.debugに変えると何も表示されなくなります。これはloggingのlevelという設定によるものです(詳細はぐぐってください)。このため、loggingの設定を変える必要があります。
具体的にはmain.pyを以下のようにします。

import logging  
import module  

logging.basicConfig(level=logging.DEBUG) # levelを変更  
logger = logging.getLogger("hoge app")  

module.hoge()  

この状態でmodule.pyのlogging.infoをlogging.debugにすると、以下のように表示されます。

python main.py  
DEBUG:module:モジュールの中だよ  

一般的に使われているようなライブラリを利用するときも、loggingのlevelを変えることによって、色々表示されるようになったりします。

loggingのフォーマットをいじくる

出力されるログのフォーマットをいじることも可能です。フォーマットの設定には以下のようにmain.pyのbasicConfigのformat引数に渡せば良いです。

import logging  
import module  

fmt = "%(asctime)s %(levelname)s %(name)s :%(message)s"  
logging.basicConfig(level=logging.INFO, format=fmt)  
logger = logging.getLogger("hoge app")  

module.hoge()  

main.pyを実行すると以下のようになります。

$ python main.py  
2020-05-16 22:07:46,772 INFO module :モジュールの中だよ  

ログっぽい表示になりましたね。
設定できる項目は色々あるので、気になる方はぐぐってください。

ファイルにログを保存する

main.pyを以下のようにすると、ログを標準出力ではなく、ファイルに保存できます。

import logging  
import module  

# filenameの引数に与えたpathにlogが保存される  
logging.basicConfig(filename="hoge.log", level=logging.INFO)  
logger = logging.getLogger("hoge app")  

module.hoge()  

まとめ

自分が昔に色々なサイトをみてログって結局どうすると良いんだろうとなったので、同じ悩みを持つ人がいなくなることを祈ります。

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@opqrstuvcutの技術とか技術以外のブログ 最近フリーランスになりました

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう