modular_api/helpers/log_helper.py (79 lines of code) (raw):
from ddtrace import patch_all
patch_all(logging=True)
import logging
import logging.config
import os
from pathlib import Path
from modular_api.helpers.constants import (
API_LOG_FILE_NAME,
CLI_LOG_FILE_NAME,
Env,
LOGS_FORMAT
)
def _get_logs_path() -> Path:
"""
Returns logs that exists
:return:
"""
path = os.getenv(Env.LOG_PATH, Env.LOG_PATH.default)
try:
os.makedirs(path, exist_ok=True)
except OSError:
default = Env.LOG_PATH.default
logging.getLogger().warning(
f'Cannot access {path}. Writing logs to {default}'
)
path = default
os.makedirs(path, exist_ok=True)
return Path(path).resolve()
LOGS_PATH = _get_logs_path()
API_LOGS_FILE = LOGS_PATH / API_LOG_FILE_NAME
CLI_LOGS_FILE = LOGS_PATH / CLI_LOG_FILE_NAME
logging.config.dictConfig({
'version': 1,
'disable_existing_loggers': False,
'formatters': {
# 'console_formatter': {
# 'format': LOGS_FORMAT
# },
'file_formatter': {
'format': LOGS_FORMAT
},
'init_formatter': {
'format': '[%(levelname)s] %(message)s'
}
},
'handlers': {
# 'console_handler': {
# 'class': 'logging.StreamHandler',
# 'formatter': 'console_formatter'
# },
'api_file_handler': {
'class': 'logging.FileHandler',
'filename': API_LOGS_FILE,
'formatter': 'file_formatter',
},
'cli_file_handler': {
'class': 'logging.FileHandler',
'filename': CLI_LOGS_FILE,
'formatter': 'file_formatter',
},
'init_handler': {
'class': 'logging.StreamHandler',
'formatter': 'init_formatter'
}
},
'loggers': {
'modular_api': {
'level': os.getenv(Env.SERVER_LOG_LEVEL,
Env.SERVER_LOG_LEVEL.default),
'handlers': ['api_file_handler'] # + 'console_handler'
},
'modular_api_cli': {
'level': os.getenv(Env.CLI_LOG_LEVEL, Env.CLI_LOG_LEVEL.default),
'handlers': ['cli_file_handler']
},
'init': {
'level': 'DEBUG',
'handlers': ['init_handler']
}
}
})
def get_logger(name: str, level=None) -> logging.Logger:
log = logging.getLogger(name)
if level:
log.setLevel(level)
return log
def init_console_handler():
# todo, since modular_api_cli module reuses a lot of code from
# modular_api module we cannot add logging.StreamHandler to modular_api.*
# logger because than each cli command will output a lot of junk. So,
# I think we should not use modules from modular_api in CLI. But
# for now this kludge: add StreamHandler only of server is running
# (this function is used only when user stars the server)
h = logging.StreamHandler()
h.setFormatter(logging.Formatter(LOGS_FORMAT))
logging.getLogger('modular_api').addHandler(h)