Pythonでは、ログの出力先や出力内容などを設定するためにlogging
モジュールが標準で備わっています。このモジュールを利用すると、ログファイル出力と標準出力を併用するケースがあります。
ログファイル出力
Pythonでロギングする際の一般的なパターンは以下の通りです。
- ファイル出力 (全て同一ログファイルに出力する)
- ファイル出力 (ログレベルに応じてログファイルを分ける)
以下に、ログレベルに応じてログファイルを分ける例を示します。
from logging import getLogger, Formatter, handlers, DEBUG, ERROR
class FileLogger:
def __init__(self, debug_file='log/app.log', error_file='log/err.log'):
self.logger = getLogger(__name__)
self.logger.setLevel(DEBUG)
formatter = Formatter('%(asctime)s %(levelname)s %(name)s: %(message)s')
# DEBUGレベルハンドラ定義
debug_handler = handlers.RotatingFileHandler(
filename=debug_file,
maxBytes=1048576,
backupCount=3
)
debug_handler.setFormatter(formatter)
debug_handler.setLevel(DEBUG)
self.logger.addHandler(debug_handler)
# ERRORレベルハンドラ
error_handler = handlers.RotatingFileHandler(
filename=error_file,
maxBytes=1048576,
backupCount=3
)
error_handler.setFormatter(formatter)
error_handler.setLevel(ERROR)
self.logger.addHandler(error_handler)
def debug(self, msg):
self.logger.debug(msg)
def info(self, msg):
self.logger.info(msg)
def warn(self, msg):
self.logger.warning(msg)
def error(self, msg):
self.logger.error(msg)
def critical(self, msg):
self.logger.critical(msg)
標準出力
標準出力のパターンは、コンテナ環境でfluentdドライバなどで外部転送したいケースがあるかなと思います。以下に、標準出力の例を示します。
from logging import getLogger, Formatter, StreamHandler, DEBUG
class StreamLogger:
def __init__(self):
self.logger = getLogger(__name__)
self.logger.setLevel(DEBUG)
formatter = Formatter('%(asctime)s %(levelname)s %(name)s: %(message)s')
handler = StreamHandler()
handler.setFormatter(formatter)
handler.setLevel(DEBUG)
self.logger.addHandler(handler)
def debug(self, msg):
self.logger.debug(msg)
def info(self, msg):
self.logger.info(msg)
def warn(self, msg):
self.logger.warning(msg)
def error(self, msg):
self.logger.error(msg)
def critical(self, msg):
self.logger.critical(msg)
以上のように、Pythonのlogging
モジュールを使うと、ログファイル出力と標準出力の両方を効果的に管理することができます。これにより、アプリケーションのデバッグや運用が容易になります。