diff --git a/api/app/database/user_info_model.py b/api/app/database/user_info_model.py index 85402ebbc..4624cb305 100644 --- a/api/app/database/user_info_model.py +++ b/api/app/database/user_info_model.py @@ -1,13 +1,11 @@ -"""Alert database model.""" +"""UserInfo database model.""" import datetime -import json import logging from sqlalchemy import JSON, TIMESTAMP, Column, DateTime, Identity, Integer, String from sqlalchemy.ext.declarative import DeclarativeMeta, declarative_base from sqlalchemy.sql.sqltypes import Boolean -logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) Base = declarative_base() diff --git a/api/app/main.py b/api/app/main.py index 0bc69f690..6cda86b0a 100644 --- a/api/app/main.py +++ b/api/app/main.py @@ -30,7 +30,11 @@ from .geotiff_from_stac_api import get_geotiff from .models import AlertsModel, StatsModel, UserInfoPydanticModel -logging.basicConfig(level=logging.DEBUG) +logging.basicConfig( + format="%(asctime)s %(levelname)-8s %(message)s", + level=logging.DEBUG, + datefmt="%Y-%m-%d %H:%M:%S", +) logger = logging.getLogger(__name__) # silence boto3 logging to avoid spamming the logs diff --git a/api/app/utils.py b/api/app/utils.py index b916c7070..f3ee8136c 100644 --- a/api/app/utils.py +++ b/api/app/utils.py @@ -1,3 +1,5 @@ +import logging + import requests from fastapi import HTTPException @@ -12,3 +14,27 @@ def forward_http_error(resp: requests.Response, excluded_codes: list[int]) -> No obj = resp.json() detail = obj.get("detail", "Unknown error") raise HTTPException(status_code=resp.status_code, detail=detail) + + +class WarningsFilter(logging.Filter): + """Custom logging filter for warnings.""" + + def __init__(self): + super().__init__() + self.max_warnings = 1 + self.warning_count = 0 + + def filter(self, record): + if ( + self.warning_count >= self.max_warnings + and record.levelno == logging.WARNING + and "converting a masked element to nan" in record.getMessage() + ): + return True + if ( + record.levelno == logging.WARNING + and "converting a masked element to nan" in record.getMessage() + ): + self.warning_count += 1 + + return False diff --git a/api/app/zonal_stats.py b/api/app/zonal_stats.py index cff541782..badb81db2 100644 --- a/api/app/zonal_stats.py +++ b/api/app/zonal_stats.py @@ -1,5 +1,6 @@ """Calulate zonal statistics and return a json or a geojson.""" import logging +import warnings from collections import defaultdict from datetime import datetime from json import dump, load @@ -20,6 +21,7 @@ ) from app.raster_utils import calculate_pixel_area, gdal_calc, reproj_match from app.timer import timed +from app.utils import WarningsFilter from app.validation import VALID_OPERATORS from fastapi import HTTPException from rasterio.warp import Resampling @@ -29,6 +31,9 @@ logger = logging.getLogger(__name__) +# Add custom filter to silence 'converting a masked element to nan' warnings +logger.addFilter(WarningsFilter()) + DEFAULT_STATS = ["min", "max", "mean", "median", "sum", "std", "nodata", "count"]