modular-service-cli/modular_service_cli/service/logger.py (53 lines of code) (raw):
from datetime import date
from getpass import getuser
from logging import DEBUG, FileHandler, Formatter, NullHandler, StreamHandler, getLogger
import os
from pathlib import Path
import re
from modular_service_cli.version import __version__
LOGS_FOLDER = Path('logs/modular-service')
LOGS_FILE_NAME = date.today().strftime('%Y-%m-%d-c7n.log')
SYSTEM_LOG_FORMAT = f'%(asctime)s [USER: {getuser()}] %(message)s'
VERBOSE_MODE_LOG_FORMAT = f'%(asctime)s [%(levelname)s] ' \
f'USER:{getuser()} LOG: %(message)s'
class SensitiveFormatter(Formatter):
"""
Formatter that removes sensitive information.
"""
_inner = '|'.join((
'refresh_token', 'id_token', 'password', 'authorization', 'secret',
'AWS_SECRET_ACCESS_KEY', 'AWS_SESSION_TOKEN', 'git_access_secret',
'api_key', 'AZURE_CLIENT_ID', 'AZURE_CLIENT_SECRET',
'GOOGLE_APPLICATION_CREDENTIALS', 'private_key', 'private_key_id',
'Authorization', 'Authentication', 'sdk_secret_key', 'key_id',
'certificate', 'access_token', 'refresh_token'
))
# assuming that only raw python dicts will be written. This regex won't
# catch exposed secured params inside JSON strings. In looks only for
# single quotes
regex = re.compile(rf"'({_inner})':\s*?'(.*?)'")
def format(self, record):
return re.sub(
self.regex,
r"'\1': '****'",
super().format(record)
)
logger = getLogger('modular-service')
logger.setLevel(DEBUG)
logger.propagate = False
if log_level := os.getenv('MODULAR_SERVICE_CLI_LOG_LEVEL'):
console_handler = StreamHandler()
try:
console_handler.setLevel(log_level)
except ValueError:
console_handler.setLevel(DEBUG)
console_handler.setFormatter(SensitiveFormatter(SYSTEM_LOG_FORMAT))
logger.addHandler(console_handler)
else:
logger.addHandler(NullHandler())
def get_logger(log_name: str, level=DEBUG):
module_logger = logger.getChild(log_name)
module_logger.setLevel(level)
return module_logger
def write_verbose_logs():
os.makedirs(LOGS_FOLDER, exist_ok=True)
file_handler = FileHandler(LOGS_FOLDER / LOGS_FILE_NAME)
file_handler.setLevel(DEBUG)
formatter = SensitiveFormatter(VERBOSE_MODE_LOG_FORMAT)
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
logger.info(f'modular cli version: {__version__}')