Skip to content

Commit

Permalink
refactor(server): logs format (#1238)
Browse files Browse the repository at this point in the history
  • Loading branch information
alambare authored Aug 9, 2024
1 parent 0af86ad commit c8733ce
Show file tree
Hide file tree
Showing 3 changed files with 80 additions and 106 deletions.
36 changes: 25 additions & 11 deletions eodag/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
noqa: D103
"""

from __future__ import annotations

import json
Expand Down Expand Up @@ -684,19 +685,32 @@ def serve_rest(
else:
sys.exit(0)
else:
import logging

logging_config = uvicorn.config.LOGGING_CONFIG
if debug:
logging_config["loggers"]["uvicorn"]["level"] = "DEBUG"
logging_config["loggers"]["uvicorn.error"]["level"] = "DEBUG"
logging_config["loggers"]["uvicorn.access"]["level"] = "DEBUG"
logging_config["formatters"]["default"][
"fmt"
] = "%(asctime)-15s %(name)-32s [%(levelname)-8s] (%(module)-17s) %(message)s"
logging_config["loggers"]["eodag"] = {
"handlers": ["default"],
"level": "DEBUG" if debug else "INFO",
"propagate": False,
uvicorn_fmt = "%(asctime)-15s %(name)-32s [%(levelname)-8s] %(message)s"
logging_config["formatters"]["access"]["fmt"] = uvicorn_fmt
logging_config["formatters"]["default"]["fmt"] = uvicorn_fmt

eodag_formatter = logging.Formatter(
"%(asctime)-15s %(name)-32s [%(levelname)-8s] (tid=%(thread)d) %(message)s"
)
logging.getLogger("eodag").handlers[0].setFormatter(eodag_formatter)

if ctx.obj["verbosity"] <= 1:
logging_config["handlers"]["null"] = {
"level": "DEBUG",
"class": "logging.NullHandler",
}
logging_config["loggers"]["uvicorn"]["handlers"] = ["null"]
logging_config["loggers"]["uvicorn.error"]["handlers"] = ["null"]
logging_config["loggers"]["uvicorn.access"]["handlers"] = ["null"]
else:
log_level = "INFO" if ctx.obj["verbosity"] == 2 else "DEBUG"
logging_config["loggers"]["uvicorn"]["level"] = log_level
logging_config["loggers"]["uvicorn.error"]["level"] = log_level
logging_config["loggers"]["uvicorn.access"]["level"] = log_level

uvicorn.run(
"eodag.rest.server:app",
host=bind_host,
Expand Down
36 changes: 18 additions & 18 deletions eodag/rest/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -355,7 +355,7 @@ async def handle_timeout(request: Request, error: Exception) -> ORJSONResponse:
@router.api_route(methods=["GET", "HEAD"], path="/", tags=["Capabilities"])
async def catalogs_root(request: Request) -> ORJSONResponse:
"""STAC catalogs root"""
logger.debug("URL: %s", request.url)
logger.info(f"{request.method} {request.state.url}")

response = await get_stac_catalogs(
request=request,
Expand All @@ -367,9 +367,9 @@ async def catalogs_root(request: Request) -> ORJSONResponse:


@router.api_route(methods=["GET", "HEAD"], path="/conformance", tags=["Capabilities"])
def conformance() -> ORJSONResponse:
def conformance(request: Request) -> ORJSONResponse:
"""STAC conformance"""
logger.debug("URL: /conformance")
logger.info(f"{request.method} {request.state.url}")
response = get_stac_conformance()

return ORJSONResponse(response)
Expand All @@ -382,7 +382,7 @@ def conformance() -> ORJSONResponse:
)
def stac_extension_oseo(request: Request) -> ORJSONResponse:
"""STAC OGC / OpenSearch extension for EO"""
logger.debug("URL: %s", request.url)
logger.info(f"{request.method} {request.state.url}")
response = get_stac_extension_oseo(url=request.state.url)

return ORJSONResponse(response)
Expand All @@ -398,7 +398,7 @@ def stac_collections_item_download(
collection_id: str, item_id: str, request: Request
) -> StarletteResponse:
"""STAC collection item download"""
logger.debug("URL: %s", request.url)
logger.info(f"{request.method} {request.state.url}")

arguments = dict(request.query_params)
provider = arguments.pop("provider", None)
Expand All @@ -422,7 +422,7 @@ def stac_collections_item_download_asset(
collection_id: str, item_id: str, asset: str, request: Request
):
"""STAC collection item asset download"""
logger.debug("URL: %s", request.url)
logger.info(f"{request.method} {request.state.url}")

arguments = dict(request.query_params)
provider = arguments.pop("provider", None)
Expand All @@ -446,7 +446,7 @@ def stac_collections_item(
collection_id: str, item_id: str, request: Request, provider: Optional[str] = None
) -> ORJSONResponse:
"""STAC collection item by id"""
logger.debug("URL: %s", request.url)
logger.info(f"{request.method} {request.state.url}")

search_request = SearchPostRequest(
provider=provider, ids=[item_id], collections=[collection_id], limit=1
Expand Down Expand Up @@ -522,7 +522,7 @@ async def list_collection_queryables(
:param collection_id: The identifier of the collection for which to retrieve queryable properties.
:returns: A json object containing the list of available queryable properties for the specified collection.
"""
logger.debug(f"URL: {request.url}")
logger.info(f"{request.method} {request.state.url}")
additional_params = dict(request.query_params)
provider = additional_params.pop("provider", None)

Expand All @@ -545,7 +545,7 @@ async def collection_by_id(
collection_id: str, request: Request, provider: Optional[str] = None
) -> ORJSONResponse:
"""STAC collection by id"""
logger.debug("URL: %s", request.url)
logger.info(f"{request.method} {request.state.url}")

response = await get_collection(
request=request,
Expand Down Expand Up @@ -576,7 +576,7 @@ async def collections(
Can be filtered using parameters: instrument, platform, platformSerialIdentifier, sensorType,
processingLevel
"""
logger.debug("URL: %s", request.url)
logger.info(f"{request.method} {request.state.url}")

collections = await all_collections(
request, provider, q, platform, instrument, constellation, datetime
Expand All @@ -594,7 +594,7 @@ def stac_catalogs_item_download(
catalogs: str, item_id: str, request: Request
) -> StarletteResponse:
"""STAC Catalog item download"""
logger.debug("URL: %s", request.url)
logger.info(f"{request.method} {request.state.url}")

arguments = dict(request.query_params)
provider = arguments.pop("provider", None)
Expand All @@ -620,7 +620,7 @@ def stac_catalogs_item_download_asset(
catalogs: str, item_id: str, asset_filter: str, request: Request
):
"""STAC Catalog item asset download"""
logger.debug("URL: %s", request.url)
logger.info(f"{request.method} {request.state.url}")

arguments = dict(request.query_params)
provider = arguments.pop("provider", None)
Expand All @@ -647,7 +647,7 @@ def stac_catalogs_item(
catalogs: str, item_id: str, request: Request, provider: Optional[str] = None
):
"""Fetch catalog's single features."""
logger.debug("URL: %s", request.url)
logger.info(f"{request.method} {request.state.url}")

list_catalog = catalogs.strip("/").split("/")

Expand Down Expand Up @@ -682,7 +682,7 @@ def stac_catalogs_items(
crunch: Optional[str] = None,
) -> ORJSONResponse:
"""Fetch catalog's features"""
logger.debug("URL: %s", request.state.url)
logger.info(f"{request.method} {request.state.url}")

base_args = {
"provider": provider,
Expand Down Expand Up @@ -721,7 +721,7 @@ async def stac_catalogs(
catalogs: str, request: Request, provider: Optional[str] = None
) -> ORJSONResponse:
"""Describe the given catalog and list available sub-catalogs"""
logger.debug("URL: %s", request.url)
logger.info(f"{request.method} {request.state.url}")

if not catalogs:
raise HTTPException(
Expand Down Expand Up @@ -756,7 +756,7 @@ async def list_queryables(request: Request) -> ORJSONResponse:
:param request: The incoming request object.
:returns: A json object containing the list of available queryable terms.
"""
logger.debug(f"URL: {request.url}")
logger.info(f"{request.method} {request.state.url}")
additional_params = dict(request.query_params.items())
provider = additional_params.pop("provider", None)
queryables = await get_queryables(
Expand Down Expand Up @@ -789,7 +789,7 @@ def get_search(
crunch: Optional[str] = None,
) -> ORJSONResponse:
"""Handler for GET /search"""
logger.debug("URL: %s", request.state.url)
logger.info(f"{request.method} {request.state.url}")

query_params = str(request.query_params)

Expand Down Expand Up @@ -843,7 +843,7 @@ def get_search(
)
async def post_search(request: Request) -> ORJSONResponse:
"""STAC post search"""
logger.debug("URL: %s", request.url)
logger.info(f"{request.method} {request.state.url}")

content_type = request.headers.get("Content-Type")

Expand Down
114 changes: 37 additions & 77 deletions eodag/utils/logging.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,88 +37,48 @@ def setup_logging(verbose: int, no_progress_bar: bool = False) -> None:
global disable_tqdm
disable_tqdm = no_progress_bar

if verbose > 3:
raise ValueError("'verbose' must be one of: 0, 1, 2, 3")

if verbose < 1:
disable_tqdm = True

if verbose <= 1:
logging.config.dictConfig(
{
"version": 1,
"disable_existing_loggers": False,
"handlers": {
"null": {"level": "DEBUG", "class": "logging.NullHandler"}
},
"loggers": {
"eodag": {"handlers": ["null"], "propagate": True, "level": "INFO"}
},
}
)
elif verbose == 2:
logging.config.dictConfig(
{
"version": 1,
"disable_existing_loggers": False,
"formatters": {
"standard": {
"format": "%(asctime)-15s %(name)-32s [%(levelname)-8s] %(message)s"
}
},
"handlers": {
"console": {
"level": "DEBUG",
"class": "logging.StreamHandler",
"formatter": "standard",
}
},
"loggers": {
"eodag": {
"handlers": ["console"],
"propagate": True,
"level": "INFO",
},
"sentinelsat": {
"handlers": ["console"],
"propagate": True,
"level": "INFO",
},
},
}
)
elif verbose == 3:
logging.config.dictConfig(
{
"version": 1,
"disable_existing_loggers": False,
"formatters": {
"verbose": {
"format": (
"%(asctime)-15s %(name)-32s [%(levelname)-8s] (tid=%(thread)d) %(message)s"
)
}
},
"handlers": {
"console": {
"level": "DEBUG",
"class": "logging.StreamHandler",
"formatter": "verbose",
}
level = "DEBUG" if verbose == 3 else "INFO"

handlers = {
"console": {
"level": level,
"class": "logging.StreamHandler",
"formatter": "standard",
},
"null": {"level": level, "class": "logging.NullHandler"},
}
handler = "console" if verbose > 1 else "null"

logging.config.dictConfig(
{
"version": 1,
"disable_existing_loggers": False,
"formatters": {
"standard": {
"format": "%(asctime)-15s %(name)-32s [%(levelname)-8s] %(message)s"
}
},
"handlers": handlers,
"loggers": {
"eodag": {
"handlers": [handler],
"propagate": True,
"level": f"{level}",
},
"loggers": {
"eodag": {
"handlers": ["console"],
"propagate": True,
"level": "DEBUG",
},
"sentinelsat": {
"handlers": ["console"],
"propagate": True,
"level": "DEBUG",
},
"eodag-cube": {
"handlers": [handler],
"propagate": True,
"level": f"{level}",
},
}
)
else:
raise ValueError("'verbose' must be one of: 0, 1, 2, 3")
},
}
)


def get_logging_verbose() -> Optional[int]:
Expand Down

0 comments on commit c8733ce

Please sign in to comment.