import logging import os from os import path import uuid from sentry_sdk.integrations.aws_lambda import AwsLambdaIntegration from sentry_sdk.utils import BadDsn, Dsn from smelog.entities import LoggerConfig, SentryConfig from smelog.factory import BoundLogger, LoggerFactory from apollo_clear_notifications.config import config from apollo_clear_notifications.constants import APP_NAME, ENV_PROD def _get_version() -> str: """Get version from file. Returns: Version. """ version_file = os.environ.get("VERSION_FILE", "../VERSION") if not path.isfile(version_file): return "unknown" with open(version_file) as f: return f.readline().strip() def _validate_dsn() -> bool: """Validate sentry DSN. """ try: Dsn(config.SENTRY_DSN) return True except BadDsn: return False def get_logger(trace_id: str or None = None) -> BoundLogger: """Get logger. Args: trace_id: Run ID. Returns: Logger. """ if not trace_id: trace_id = str(uuid.uuid4()) environment = os.environ.get("ENVIRONMENT", ENV_PROD).lower() is_production = environment == ENV_PROD log_config = LoggerConfig( name=APP_NAME, version=_get_version(), level=logging.INFO if is_production else logging.DEBUG, environment=environment ) if _validate_dsn(): log_config.sentry = SentryConfig( dsn=config.SENTRY_DSN, integrations=[AwsLambdaIntegration(timeout_warning=True)] ) logger = LoggerFactory(log_config).get_logger(APP_NAME) logger = logger.bind(request_id=trace_id) return logger