【Python】ログ取得ライブラリlogginの共通化 方法

【Python 】
ログ取得
ライブラリ
logginの共通化

今回、Pythonでログを取得するのに利用するライブラリ loggingを利用しやすいように、共通クラスを作成したので紹介します。

 コピーするだけで簡単に利用できます。

目次

ディレクトリの構成

以下がディレクトリの構成になります。

file/
  ├ log/general.log
  ├ src/
     ├main.py
     └Logger.py

共通で利用するLoggerクラス

importをするだけで、簡単にログを取得することができます。

import datetime
import logging


class Logger:

    def __init__(self, debug_mode=False, use_utf8=True,isWrite=False):
        """
        コンストラクタ

        Parameters
        ----------
        debug_mode : bool, default False
            デバッグモードで起動するかのboolean
        use_utf8 : bool, default True
            ログをutf-8で出力するかのboolean
        """
        

        
        if isWrite :
            #新規上書き(ログ吐き出し容量が多すぎるので機能追加(write)
            sFileMode = 'w'
        else:
            #未指定では追記(append) ※loggingのデフォルトではappend
            sFileMode = 'a'

        # タイムゾーンをJSTに設定
        self.timezone = datetime.timezone(datetime.timedelta(hours=+9), 'JST')

        self.general_logger = logging.getLogger(__name__)
        stream_handler = logging.StreamHandler()
        # utf8で出力するかどうか
        if use_utf8:
            file_general_handler = logging.FileHandler('../logs/general.log', encoding='utf-8',mode = sFileMode)
        else:
            file_general_handler = logging.FileHandler('../logs/general.log',mode = sFileMode)
            
        

        if len(self.general_logger.handlers) == 0:
            self.general_logger.addHandler(stream_handler)
            self.general_logger.addHandler(file_general_handler)
            if debug_mode:
                self.general_logger.setLevel(logging.DEBUG)
                self.info('created logger: DEBUG mode')
            else:
                self.general_logger.setLevel(logging.INFO)

            
    
    def debug(self, message):
        # 時刻をつけてコンソールとログに出力
        self.general_logger.debug('[{}][DEGUB] - {}'.format(self.now_string(), message))

    def info(self, message):
        # 時刻をつけてコンソールとログに出力
        self.general_logger.info('[{}][INFO] - {}'.format(self.now_string(), message))

    def warning(self, message):
        # 時刻をつけてコンソールとログに出力
        self.general_logger.warning('[{}][WARNING] - {}'.format(self.now_string(), message))

    def now_string(self):
        return str(datetime.datetime.now(self.timezone).strftime('%Y-%m-%d %H:%M:%S'))
  1. debug_mode …. デバッグ用のログを取得するかを設定します。
  2. use_utf8 … utf8で出力するかを設定します。
  3. isWrite … 毎回追記するか、システムの実行の度に上書きするかを指定します。

取得できるログの種類は、

デフォルトのログ(info)、デバッグログ(debug)、警告ログ(warning)の3種類をログとして取得することができます。

利用例

#============================================
#ログ
from Logger import Logger
#ファイル名をloggerに設定
log = Logger( debug_mode=True)
#============================================
if __name__ == '__main__':
    log.info("ログ取得開始")

    log.debug("デバッグのログ")

    log.warning("警告のログ")

利用例です。共通のLogger.pyを読み込むことで、どのプログラムでも簡単にログ取得ができるようになります。

[2022-02-17 00:09:25][INFO] - created logger: DEBUG mode
[2022-02-17 00:09:25][INFO] - ログ取得開始
[2022-02-17 00:09:25][DEGUB] - デバッグのログ
[2022-02-17 00:09:25][WARNING] - 警告のログ

上記を実行するとこのようなログの出力になります。

まとめ

今回、ログを簡単に取得するloggingを使った共通クラスを紹介しました。

コピーするだけで簡単に利用できるので、今までログを取っていなかった方もプログラムに実装してみてはいかがでしょうか?

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次