2022-07-02 16:58:29 +09:00

61 lines
2.0 KiB
Python

import datetime
import logging
import sys
from zoneinfo import ZoneInfo
from constants import LAUNCH_ON_LOCAL, LOG_DATE_FORMAT, LOG_FORMAT
from environments import LOG_LEVEL, TZ
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(TZ)).timetuple()
# ローカル環境で動かす場合、標準出力ハンドラーを追加する
# AWS Lambda上では`LambdaLoggerHandler`がデフォルトでセットされている
if len(sys.argv) == 2 and sys.argv[1] == LAUNCH_ON_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