import logging import os 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 BoundLogger, LoggerFactory from config import ENVIRONMENT, IS_LOCAL, SENTRY_DSN from constants import APP_NAME, ENV_PROD def _get_version() -> str: """ Get version from file :return: current 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(SENTRY_DSN) return True except BadDsn: return False def get_logger(trace_id: str, **kwargs) -> BoundLogger: """ :param trace_id: Run ID :return: Logger """ 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, is_local=IS_LOCAL, ) if not IS_LOCAL and _validate_dsn(): log_config.sentry = SentryConfig(dsn=SENTRY_DSN, integrations=[AwsLambdaIntegration(timeout_warning=True)]) logger = LoggerFactory(log_config).get_logger(APP_NAME) logger = logger.bind(request_id=trace_id, **kwargs) return logger