Update src/utils/custom_logger.py
Some checks failed
Python Test / python-test (push) Failing after 12s

This commit is contained in:
ry.yamafuji 2025-12-11 22:27:47 +09:00
parent b9ef4422fb
commit 460f097d1e

View File

@ -1,113 +1,113 @@
import os import os
import logging import logging
import json import json
import functools import functools
from .singleton import Singleton from .singleton import Singleton
class CoogelCustomLogger(): class CoogelCustomLogger():
"""Google Cloud Functions用のシンプルなカスタムロガー""" """Google Cloud Functions用のシンプルなカスタムロガー"""
def __init__(self, name="main"): def __init__(self, name="main"):
self.logger = logging.getLogger(name) self.logger = logging.getLogger(name)
self.logger.setLevel(logging.INFO) self.logger.setLevel(logging.INFO)
if not self.logger.handlers: if not self.logger.handlers:
handler = logging.StreamHandler() handler = logging.StreamHandler()
handler.setLevel(logging.INFO) handler.setLevel(logging.INFO)
# メッセージのみ(フォーマットなし) # メッセージのみ(フォーマットなし)
formatter = logging.Formatter("%(message)s") formatter = logging.Formatter("%(message)s")
handler.setFormatter(formatter) handler.setFormatter(formatter)
self.logger.addHandler(handler) self.logger.addHandler(handler)
# 親ロガーrootへの伝播を止める → 二重出力防止 # 親ロガー(root)への伝播を止める → 二重出力防止
self.logger.propagate = False self.logger.propagate = False
def _log(self, message,level="INFO",**fields): def _log(self, message,level="INFO",**fields):
payload = { payload = {
"severity": level, "severity": level,
"message": f"{message}", "message": f"{message}",
**fields **fields
} }
self.logger.info(json.dumps(payload, ensure_ascii=False)) self.logger.info(json.dumps(payload, ensure_ascii=False))
def info(self, message, **fields): def info(self, message, **fields):
self._log(message, level="INFO", **fields) self._log(message, level="INFO", **fields)
def warning(self, message, **fields): def warning(self, message, **fields):
self._log(message, level="WARNING", **fields) self._log(message, level="WARNING", **fields)
def error(self, message, **fields): def error(self, message, **fields):
self._log(message, level="ERROR", **fields) self._log(message, level="ERROR", **fields)
def exception(self, message, **fields): def exception(self, message, **fields):
payload = { payload = {
"severity": "ERROR", "severity": "ERROR",
"message": f"{message}", "message": f"{message}",
**fields **fields
} }
self.logger.info( self.logger.info(
json.dumps(payload, ensure_ascii=False), json.dumps(payload, ensure_ascii=False),
exc_info=True exc_info=True
) )
def debug(self, message, **fields): def debug(self, message, **fields):
self._log(message, level="DEBUG", **fields) self._log(message, level="DEBUG", **fields)
class CustomLogger(Singleton): class CustomLogger(Singleton):
""" """
Singleton logger class that initializes a logger with a specified name Singleton logger class that initializes a logger with a specified name
and log file.It provides a method to log entry and exit of functions. and log file.It provides a method to log entry and exit of functions.
""" """
def __init__(self, name="main", log_file=None, level=logging.INFO): def __init__(self, name="main", log_file=None, level=logging.INFO):
if hasattr(self, "_initialized") and self._initialized: if hasattr(self, "_initialized") and self._initialized:
return # すでに初期化済みなら何もしない return # すでに初期化済みなら何もしない
if os.getenv("ENV", "local")=="local": if os.getenv("ENV", "local")=="local":
self.logger = logging.getLogger(name) self.logger = logging.getLogger(name)
self.logger.setLevel(level) self.logger.setLevel(level)
self.logger.propagate = False self.logger.propagate = False
formatter = logging.Formatter( formatter = logging.Formatter(
"%(asctime)s %(levelname)s " "%(asctime)s %(levelname)s "
"[%(filename)s:%(lineno)3d]: %(message)s" "[%(filename)s:%(lineno)3d]: %(message)s"
) )
# Console handler # Console handler
ch = logging.StreamHandler() ch = logging.StreamHandler()
ch.setFormatter(formatter) ch.setFormatter(formatter)
self.logger.addHandler(ch) self.logger.addHandler(ch)
# File handler # File handler
if log_file: if log_file:
fh = logging.FileHandler(log_file, encoding="utf-8") fh = logging.FileHandler(log_file, encoding="utf-8")
fh.setFormatter(formatter) fh.setFormatter(formatter)
self.logger.addHandler(fh) self.logger.addHandler(fh)
self._initialized = True self._initialized = True
elif os.getenv("ENV") in ["dev", "prd"]: elif os.getenv("ENV") in ["dev", "prd"]:
self.logger = CoogelCustomLogger(name) self.logger = CoogelCustomLogger(name)
self._initialized = True self._initialized = True
def get_logger(self): def get_logger(self):
return self.logger return self.logger
def log_entry_exit(self, func): def log_entry_exit(self, func):
@functools.wraps(func) @functools.wraps(func)
def wrapper(*args, **kwargs): def wrapper(*args, **kwargs):
self.logger.info(f"Enter: {func.__qualname__}") self.logger.info(f"Enter: {func.__qualname__}")
result = func(*args, **kwargs) result = func(*args, **kwargs)
self.logger.info(f"Exit: {func.__qualname__}") self.logger.info(f"Exit: {func.__qualname__}")
return result return result
return wrapper return wrapper
def get_logger(name="main", log_file=None, level=logging.INFO): def get_logger(name="main", log_file=None, level=logging.INFO):
custom_logger = CustomLogger(name, log_file, level) custom_logger = CustomLogger(name, log_file, level)
return custom_logger.get_logger() return custom_logger.get_logger()