import logging import os import uuid from os import path from typing import Tuple 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 import config from consts 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) -> Tuple[BindableLogger, str]: """Get logger. Args: trace_id: Run ID. Returns: Logger. """ if not trace_id: trace_id = str(uuid.uuid4()) is_production = config.ENVIRONMENT == ENV_PROD log_config = LoggerConfig( name=APP_NAME, version=_get_version(), level=logging.INFO if is_production else logging.DEBUG, environment=config.ENVIRONMENT, is_local=config.IS_LOCAL, ) if not config.IS_LOCAL and _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, trace_id logger, trace_id = get_logger()