61 lines
2.0 KiB
Python
61 lines
2.0 KiB
Python
import datetime
|
|
import logging
|
|
import sys
|
|
from zoneinfo import ZoneInfo
|
|
|
|
from constants import DEFAULT_TIMEZONE, LOG_DATE_FORMAT, LOG_FORMAT
|
|
from environments import LOG_LEVEL
|
|
|
|
|
|
class SingletonLogger:
|
|
__logger: logging.Logger = None
|
|
|
|
def __init__(self) -> None:
|
|
# logger設定
|
|
logger = logging.getLogger()
|
|
formatter = logging.Formatter(
|
|
LOG_FORMAT,
|
|
LOG_DATE_FORMAT
|
|
)
|
|
formatter.converter = lambda *arg: datetime.datetime.now(ZoneInfo(DEFAULT_TIMEZONE)).timetuple()
|
|
# ローカル環境で動かす場合、標準出力ハンドラーを追加する
|
|
# AWS Lambda上では`LambdaLoggerHandler`がデフォルトでセットされている
|
|
if len(sys.argv) == 2 and sys.argv[1] == 'local':
|
|
localHandler = logging.StreamHandler()
|
|
logger.addHandler(localHandler)
|
|
for handler in logger.handlers:
|
|
handler.setFormatter(formatter)
|
|
level = logging.getLevelName(LOG_LEVEL)
|
|
logger.setLevel(level)
|
|
|
|
self.__logger = logger
|
|
|
|
def debug(self, log_id: str, msg: str):
|
|
self._log(logging.DEBUG, log_id, msg)
|
|
|
|
def info(self, log_id: str, msg: str):
|
|
self._log(logging.INFO, log_id, msg)
|
|
|
|
def warning(self, log_id: str, msg: str):
|
|
self._log(logging.WARNING, log_id, msg)
|
|
|
|
def error(self, log_id: str, msg: str):
|
|
self._log(logging.ERROR, log_id, msg)
|
|
|
|
def exception(self, log_id: str, msg: str):
|
|
self._log(logging.ERROR, log_id, msg, exc_info=True)
|
|
|
|
def _log(self, log_level: int, log_id: str, msg: str, exc_info=False):
|
|
self.__logger.log(log_level, f'{log_id} {msg}', exc_info=exc_info)
|
|
|
|
|
|
class MeDaCaLogger:
|
|
__unique_instance: logging.Logger = None
|
|
|
|
@staticmethod
|
|
def get_logger() -> SingletonLogger:
|
|
# インスタンス未生成の場合、唯一のインスタンスを生成する
|
|
if not MeDaCaLogger.__unique_instance:
|
|
MeDaCaLogger.__unique_instance = SingletonLogger()
|
|
return MeDaCaLogger.__unique_instance
|