import logging import os import uuid from os import path 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 BindableLogger, LoggerFactory from apollo_messages_views import config from apollo_messages_views.constants.base 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) -> BindableLogger: """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