diff --git a/docs/changes/newsfragments/239.enh b/docs/changes/newsfragments/239.enh new file mode 100644 index 000000000..f76a50d91 --- /dev/null +++ b/docs/changes/newsfragments/239.enh @@ -0,0 +1 @@ +Improve logging consistency of components by `Synchon Mandal`_ diff --git a/junifer/api/functions.py b/junifer/api/functions.py index 7c08c5bf6..35ab24f19 100644 --- a/junifer/api/functions.py +++ b/junifer/api/functions.py @@ -10,6 +10,8 @@ import shutil from pathlib import Path +import structlog + from ..api.queue_context import GnuParallelLocalAdapter, HTCondorAdapter from ..datagrabber import BaseDataGrabber from ..markers import BaseMarker @@ -27,11 +29,14 @@ PreprocessorLike, StorageLike, ) -from ..utils import logger, raise_error, warn_with_log, yaml +from ..utils import raise_error, warn_with_log, yaml __all__ = ["collect", "list_elements", "queue", "reset", "run"] +_log = structlog.get_logger("junifer") +logger = _log.bind(pkg="api") + def _get_datagrabber(datagrabber_config: dict) -> DataGrabberLike: """Get DataGrabber. diff --git a/junifer/api/queue_context/gnu_parallel_local_adapter.py b/junifer/api/queue_context/gnu_parallel_local_adapter.py index 42ed5b3d2..6d64aa48b 100644 --- a/junifer/api/queue_context/gnu_parallel_local_adapter.py +++ b/junifer/api/queue_context/gnu_parallel_local_adapter.py @@ -9,12 +9,13 @@ from typing import Any from ...typing import Elements -from ...utils import logger, make_executable, raise_error, run_ext_cmd +from ...utils import make_executable, raise_error, run_ext_cmd from .queue_context_adapter import ( EnvKind, EnvShell, QueueContextAdapter, QueueContextEnv, + logger, ) diff --git a/junifer/api/queue_context/htcondor_adapter.py b/junifer/api/queue_context/htcondor_adapter.py index 508829c59..02b6b1d3e 100644 --- a/junifer/api/queue_context/htcondor_adapter.py +++ b/junifer/api/queue_context/htcondor_adapter.py @@ -10,12 +10,13 @@ from typing import Any from ...typing import Elements -from ...utils import logger, make_executable, raise_error, run_ext_cmd +from ...utils import make_executable, raise_error, run_ext_cmd from .queue_context_adapter import ( EnvKind, EnvShell, QueueContextAdapter, QueueContextEnv, + logger, ) diff --git a/junifer/api/queue_context/queue_context_adapter.py b/junifer/api/queue_context/queue_context_adapter.py index a5bc48c5a..5885b3da2 100644 --- a/junifer/api/queue_context/queue_context_adapter.py +++ b/junifer/api/queue_context/queue_context_adapter.py @@ -19,6 +19,7 @@ from abc import ABC, abstractmethod from enum import Enum +import structlog from pydantic import BaseModel, ConfigDict from ...utils import raise_error @@ -26,6 +27,9 @@ __all__ = ["EnvKind", "EnvShell", "QueueContextAdapter", "QueueContextEnv"] +_log = structlog.get_logger("junifer") +logger = _log.bind(pkg="api") + class EnvKind(str, Enum): """Accepted Python environment kind.""" diff --git a/junifer/cli/parser.py b/junifer/cli/parser.py index eba6abb55..930b5bad6 100644 --- a/junifer/cli/parser.py +++ b/junifer/cli/parser.py @@ -10,13 +10,17 @@ from pathlib import Path import pandas as pd +import structlog from ..typing import Elements -from ..utils import logger, raise_error, warn_with_log, yaml +from ..utils import raise_error, warn_with_log, yaml __all__ = ["parse_elements", "parse_yaml"] +_log = structlog.get_logger("junifer") +logger = _log.bind(pkg="cli") + def parse_yaml(filepath: str | Path) -> dict: # noqa: C901 """Parse YAML. diff --git a/junifer/data/coordinates/_ants_coordinates_warper.py b/junifer/data/coordinates/_ants_coordinates_warper.py index 02c032b38..120413d77 100644 --- a/junifer/data/coordinates/_ants_coordinates_warper.py +++ b/junifer/data/coordinates/_ants_coordinates_warper.py @@ -9,7 +9,7 @@ from numpy.typing import ArrayLike from ...pipeline import WorkDirManager -from ...utils import logger, run_ext_cmd +from ...utils import run_ext_cmd __all__ = ["ANTsCoordinatesWarper"] @@ -46,6 +46,9 @@ def warp( The transformed coordinates. """ + # Imported here to avoid circular import + from ._coordinates import logger + logger.debug("Using ANTs for coordinates transformation") # Create element-specific tempdir for storing post-warping assets diff --git a/junifer/data/coordinates/_coordinates.py b/junifer/data/coordinates/_coordinates.py index b9899ae1f..c0f1c6115 100644 --- a/junifer/data/coordinates/_coordinates.py +++ b/junifer/data/coordinates/_coordinates.py @@ -9,10 +9,11 @@ import numpy as np import pandas as pd +import structlog from junifer_data import get from numpy.typing import ArrayLike -from ...utils import logger, raise_error +from ...utils import raise_error from ..pipeline_data_registry_base import BasePipelineDataRegistry from ..utils import JUNIFER_DATA_PARAMS, get_dataset_path, get_native_warper from ._ants_coordinates_warper import ANTsCoordinatesWarper @@ -21,6 +22,9 @@ __all__ = ["CoordinatesRegistry"] +_log = structlog.get_logger("junifer") +logger = _log.bind(pkg="data") + class CoordinatesRegistry(BasePipelineDataRegistry): """Class for coordinates data registry. diff --git a/junifer/data/coordinates/_fsl_coordinates_warper.py b/junifer/data/coordinates/_fsl_coordinates_warper.py index 0f36e0bdb..e96f84da2 100644 --- a/junifer/data/coordinates/_fsl_coordinates_warper.py +++ b/junifer/data/coordinates/_fsl_coordinates_warper.py @@ -9,7 +9,7 @@ from numpy.typing import ArrayLike from ...pipeline import WorkDirManager -from ...utils import logger, run_ext_cmd +from ...utils import run_ext_cmd __all__ = ["FSLCoordinatesWarper"] @@ -46,6 +46,9 @@ def warp( The transformed coordinates. """ + # Imported here to avoid circular import + from ._coordinates import logger + logger.debug("Using FSL for coordinates transformation") # Create element-specific tempdir for storing post-warping assets diff --git a/junifer/data/maps/_ants_maps_warper.py b/junifer/data/maps/_ants_maps_warper.py index 3047f096f..fe00c5969 100644 --- a/junifer/data/maps/_ants_maps_warper.py +++ b/junifer/data/maps/_ants_maps_warper.py @@ -9,7 +9,7 @@ import nibabel as nib from ...pipeline import WorkDirManager -from ...utils import logger, raise_error, run_ext_cmd +from ...utils import raise_error, run_ext_cmd from ..template_spaces import get_template, get_xfm @@ -71,6 +71,9 @@ def warp( If ``warp_data`` is None when ``dst="T1w"``. """ + # Imported here to avoid circular import + from ._maps import logger + # Create element-scoped tempdir so that warped maps is # available later as nibabel stores file path reference for # loading on computation diff --git a/junifer/data/maps/_fsl_maps_warper.py b/junifer/data/maps/_fsl_maps_warper.py index fe00690f8..2cb316531 100644 --- a/junifer/data/maps/_fsl_maps_warper.py +++ b/junifer/data/maps/_fsl_maps_warper.py @@ -9,7 +9,7 @@ import nibabel as nib from ...pipeline import WorkDirManager -from ...utils import logger, run_ext_cmd +from ...utils import run_ext_cmd if TYPE_CHECKING: @@ -53,6 +53,9 @@ def warp( The transformed maps image. """ + # Imported here to avoid circular import + from ._maps import logger + logger.debug("Using FSL for maps transformation") # Create element-scoped tempdir so that warped maps is diff --git a/junifer/data/maps/_maps.py b/junifer/data/maps/_maps.py index 67a2d8022..69aa54daa 100644 --- a/junifer/data/maps/_maps.py +++ b/junifer/data/maps/_maps.py @@ -9,9 +9,10 @@ import nibabel as nib import nilearn.image as nimg import numpy as np +import structlog from junifer_data import get -from ...utils import logger, raise_error +from ...utils import raise_error from ..pipeline_data_registry_base import BasePipelineDataRegistry from ..utils import ( JUNIFER_DATA_PARAMS, @@ -29,6 +30,9 @@ __all__ = ["MapsRegistry"] +_log = structlog.get_logger("junifer") +logger = _log.bind(pkg="data") + class MapsRegistry(BasePipelineDataRegistry): """Class for maps data registry. diff --git a/junifer/data/masks/_ants_mask_warper.py b/junifer/data/masks/_ants_mask_warper.py index eab981702..dc6a686c9 100644 --- a/junifer/data/masks/_ants_mask_warper.py +++ b/junifer/data/masks/_ants_mask_warper.py @@ -10,7 +10,7 @@ import numpy as np from ...pipeline import WorkDirManager -from ...utils import logger, raise_error, run_ext_cmd +from ...utils import raise_error, run_ext_cmd from ..template_spaces import get_template, get_xfm @@ -92,6 +92,9 @@ def warp( If ``warp_data`` is None when ``dst="T1w"``. """ + # Imported here to avoid circular import + from ._masks import logger + # Create element-scoped tempdir so that warped mask is # available later as nibabel stores file path reference for # loading on computation diff --git a/junifer/data/masks/_fsl_mask_warper.py b/junifer/data/masks/_fsl_mask_warper.py index 50eb36b9a..877dea770 100644 --- a/junifer/data/masks/_fsl_mask_warper.py +++ b/junifer/data/masks/_fsl_mask_warper.py @@ -10,7 +10,7 @@ import numpy as np from ...pipeline import WorkDirManager -from ...utils import logger, run_ext_cmd +from ...utils import run_ext_cmd if TYPE_CHECKING: @@ -74,6 +74,9 @@ def warp( The transformed mask image. """ + # Imported here to avoid circular import + from ._masks import logger + logger.debug("Using FSL for mask transformation") # Create element-scoped tempdir so that warped mask is diff --git a/junifer/data/masks/_masks.py b/junifer/data/masks/_masks.py index ae3ad3a6e..f8c0cd624 100644 --- a/junifer/data/masks/_masks.py +++ b/junifer/data/masks/_masks.py @@ -15,6 +15,7 @@ import nibabel as nib import nilearn.image as nimg import numpy as np +import structlog from junifer_data import get from nilearn.masking import ( compute_background_mask, @@ -22,7 +23,7 @@ intersect_masks, ) -from ...utils import logger, raise_error +from ...utils import raise_error from ..pipeline_data_registry_base import BasePipelineDataRegistry from ..template_spaces import get_template from ..utils import ( @@ -41,6 +42,9 @@ __all__ = ["MaskRegistry", "compute_brain_mask"] +_log = structlog.get_logger("junifer") +logger = _log.bind(pkg="data") + def compute_brain_mask( target_data: dict[str, Any], diff --git a/junifer/data/parcellations/_ants_parcellation_warper.py b/junifer/data/parcellations/_ants_parcellation_warper.py index 58e602ba9..864d0b2ec 100644 --- a/junifer/data/parcellations/_ants_parcellation_warper.py +++ b/junifer/data/parcellations/_ants_parcellation_warper.py @@ -9,7 +9,7 @@ import nibabel as nib from ...pipeline import WorkDirManager -from ...utils import logger, raise_error, run_ext_cmd +from ...utils import raise_error, run_ext_cmd from ..template_spaces import get_template, get_xfm @@ -71,6 +71,9 @@ def warp( If ``warp_data`` is None when ``dst="T1w"``. """ + # Imported here to avoid circular import + from ._parcellations import logger + # Create element-scoped tempdir so that warped parcellation is # available later as nibabel stores file path reference for # loading on computation diff --git a/junifer/data/parcellations/_fsl_parcellation_warper.py b/junifer/data/parcellations/_fsl_parcellation_warper.py index b94849e69..93a29ca6d 100644 --- a/junifer/data/parcellations/_fsl_parcellation_warper.py +++ b/junifer/data/parcellations/_fsl_parcellation_warper.py @@ -9,7 +9,7 @@ import nibabel as nib from ...pipeline import WorkDirManager -from ...utils import logger, run_ext_cmd +from ...utils import run_ext_cmd if TYPE_CHECKING: @@ -53,6 +53,9 @@ def warp( The transformed parcellation image. """ + # Imported here to avoid circular import + from ._parcellations import logger + logger.debug("Using FSL for parcellation transformation") # Create element-scoped tempdir so that warped parcellation is diff --git a/junifer/data/parcellations/_parcellations.py b/junifer/data/parcellations/_parcellations.py index 4dda3d31b..ff51988e7 100644 --- a/junifer/data/parcellations/_parcellations.py +++ b/junifer/data/parcellations/_parcellations.py @@ -13,9 +13,10 @@ import nilearn.image as nimg import numpy as np import pandas as pd +import structlog from junifer_data import get -from ...utils import logger, raise_error, warn_with_log +from ...utils import raise_error, warn_with_log from ..pipeline_data_registry_base import BasePipelineDataRegistry from ..utils import ( JUNIFER_DATA_PARAMS, @@ -36,6 +37,9 @@ "merge_parcellations", ] +_log = structlog.get_logger("junifer") +logger = _log.bind(pkg="data") + class ParcellationRegistry(BasePipelineDataRegistry): """Class for parcellation data registry. @@ -58,8 +62,12 @@ def __init__(self) -> None: # The built-in parcellations are files that are shipped with the # junifer-data dataset. # Make built-in and external dictionaries for validation later - self._builtin = {} - self._external = {} + self._builtin: dict[ + str, dict[str, str | int | Path | list[str] | list[int]] + ] = {} + self._external: dict[ + str, dict[str, str | int | Path | list[str] | list[int]] + ] = {} # Add SUIT self._builtin.update( diff --git a/junifer/data/template_spaces.py b/junifer/data/template_spaces.py index 334d9b902..b36417038 100644 --- a/junifer/data/template_spaces.py +++ b/junifer/data/template_spaces.py @@ -8,15 +8,19 @@ import nibabel as nib import numpy as np +import structlog from junifer_data import get from templateflow import api as tflow -from ..utils import logger, raise_error +from ..utils import raise_error from .utils import JUNIFER_DATA_PARAMS, closest_resolution, get_dataset_path __all__ = ["get_template", "get_xfm"] +_log = structlog.get_logger("junifer") +logger = _log.bind(pkg="data") + def get_xfm(src: str, dst: str) -> Path: # pragma: no cover """Fetch warp files to convert from ``src`` to ``dst``. diff --git a/junifer/data/utils.py b/junifer/data/utils.py index e10100800..9c24a0100 100644 --- a/junifer/data/utils.py +++ b/junifer/data/utils.py @@ -8,8 +8,9 @@ from pathlib import Path import numpy as np +import structlog -from ..utils import config, logger, raise_error +from ..utils import config, raise_error __all__ = [ @@ -21,6 +22,8 @@ "get_native_warper", ] +_log = structlog.get_logger("junifer") +logger = _log.bind(pkg="data") # junifer-data version constant JUNIFER_DATA_VERSION = "7" diff --git a/junifer/datagrabber/base.py b/junifer/datagrabber/base.py index 5b4650209..4fc9c4a12 100644 --- a/junifer/datagrabber/base.py +++ b/junifer/datagrabber/base.py @@ -11,16 +11,20 @@ from pathlib import Path from typing import Annotated, Any +import structlog from aenum import Enum as AEnum from pydantic import BaseModel, BeforeValidator, ConfigDict, Field from ..pipeline import UpdateMetaMixin from ..typing import Element, Elements -from ..utils import ensure_list, logger, raise_error +from ..utils import ensure_list, raise_error __all__ = ["BaseDataGrabber", "DataType"] +_log = structlog.get_logger("junifer") +logger = _log.bind(pkg="datagrabber", step="datagrabber") + class DataType(str, AEnum): """Accepted data type.""" @@ -69,6 +73,12 @@ def model_post_init(self, context: Any): # noqa: D102 logger.debug(f"\ttypes = {self.types}") # Run extra validation for datagrabbers and fail early if needed self.validate_datagrabber_params() + # Convert to correct data type + # self.types = [DataType(t) for t in self.types] + logger.info( + f"Parameters: {self.model_dump(mode='json')}", + component=self.__class__.__name__, + ) def validate_datagrabber_params(self) -> None: """Run extra logical validation for datagrabber. diff --git a/junifer/datagrabber/datalad_base.py b/junifer/datagrabber/datalad_base.py index df688dfa4..9c28fa4a7 100644 --- a/junifer/datagrabber/datalad_base.py +++ b/junifer/datagrabber/datalad_base.py @@ -20,8 +20,8 @@ from ..api.decorators import register_datagrabber from ..pipeline import WorkDirManager from ..typing import Element -from ..utils import config, logger, raise_error, warn_with_log -from .base import BaseDataGrabber +from ..utils import config, raise_error, warn_with_log +from .base import BaseDataGrabber, logger __all__ = ["DataladDataGrabber"] diff --git a/junifer/datagrabber/pattern.py b/junifer/datagrabber/pattern.py index 9b4bd60bf..3996faa3c 100644 --- a/junifer/datagrabber/pattern.py +++ b/junifer/datagrabber/pattern.py @@ -16,8 +16,8 @@ from ..api.decorators import register_datagrabber from ..typing import DataGrabberPatterns, Elements -from ..utils import logger, raise_error -from .base import BaseDataGrabber +from ..utils import raise_error +from .base import BaseDataGrabber, logger from .pattern_validation_mixin import PatternValidationMixin diff --git a/junifer/datagrabber/pattern_datalad.py b/junifer/datagrabber/pattern_datalad.py index 4bba19354..9864591af 100644 --- a/junifer/datagrabber/pattern_datalad.py +++ b/junifer/datagrabber/pattern_datalad.py @@ -8,7 +8,7 @@ from pydantic import ConfigDict from ..api.decorators import register_datagrabber -from ..utils import logger +from .base import logger from .datalad_base import DataladDataGrabber from .pattern import PatternDataGrabber diff --git a/junifer/datagrabber/pattern_validation_mixin.py b/junifer/datagrabber/pattern_validation_mixin.py index eadd0e675..61a57348e 100644 --- a/junifer/datagrabber/pattern_validation_mixin.py +++ b/junifer/datagrabber/pattern_validation_mixin.py @@ -16,9 +16,9 @@ from aenum import extend_enum -from ..datagrabber import DataType from ..typing import DataGrabberPatterns -from ..utils import logger, raise_error, warn_with_log +from ..utils import raise_error, warn_with_log +from .base import DataType, logger __all__ = [ diff --git a/junifer/datareader/default.py b/junifer/datareader/default.py index 13df365d2..04d5a39dd 100644 --- a/junifer/datareader/default.py +++ b/junifer/datareader/default.py @@ -8,15 +8,18 @@ import nibabel as nib import pandas as pd +import structlog from pydantic import BaseModel from ..api.decorators import register_datareader from ..pipeline import PipelineStepMixin, UpdateMetaMixin -from ..utils.logging import logger, warn_with_log +from ..utils.logging import warn_with_log __all__ = ["DefaultDataReader"] +_log = structlog.get_logger("junifer") +logger = _log.bind(pkg="datareader", step="datareader") # Map each file extension to a type _extensions = { diff --git a/junifer/markers/base.py b/junifer/markers/base.py index bd0a2eec6..be2ecba1c 100644 --- a/junifer/markers/base.py +++ b/junifer/markers/base.py @@ -8,17 +8,21 @@ from copy import deepcopy from typing import Any, ClassVar +import structlog from pydantic import BaseModel, ConfigDict from ..datagrabber import DataType from ..pipeline import PipelineStepMixin, UpdateMetaMixin from ..storage import StorageType from ..typing import MarkerInOutMappings, StorageLike -from ..utils import logger, raise_error +from ..utils import raise_error __all__ = ["BaseMarker"] +_log = structlog.get_logger("junifer") +logger = _log.bind(pkg="markers", step="marker") + class BaseMarker(BaseModel, ABC, PipelineStepMixin, UpdateMetaMixin): """Abstract base class for marker. @@ -84,6 +88,9 @@ def model_post_init(self, context: Any): # noqa: D102 self.validate_marker_params() # Set default name if not provided self.name = self.__class__.__name__ if self.name is None else self.name + logger.info( + f"Parameters: {self.model_dump(mode='json')}", component=self.name + ) @property def valid_inputs(self) -> list[DataType]: diff --git a/junifer/markers/brainprint.py b/junifer/markers/brainprint.py index d4c7f17cf..1ccae4f5a 100644 --- a/junifer/markers/brainprint.py +++ b/junifer/markers/brainprint.py @@ -24,8 +24,8 @@ from ..pipeline import ExtDep, WorkDirManager from ..storage import StorageType from ..typing import Dependencies, ExternalDependencies, MarkerInOutMappings -from ..utils import logger, run_ext_cmd -from .base import BaseMarker +from ..utils import run_ext_cmd +from .base import BaseMarker, logger __all__ = ["BrainPrint"] diff --git a/junifer/markers/complexity/hurst_exponent.py b/junifer/markers/complexity/hurst_exponent.py index 8d2f5ec82..1bc9ce744 100644 --- a/junifer/markers/complexity/hurst_exponent.py +++ b/junifer/markers/complexity/hurst_exponent.py @@ -9,7 +9,8 @@ import numpy as np from ...api.decorators import register_marker -from ...utils import logger, warn_with_log +from ...utils import warn_with_log +from ..base import logger from .complexity_base import ComplexityBase diff --git a/junifer/markers/complexity/multiscale_entropy_auc.py b/junifer/markers/complexity/multiscale_entropy_auc.py index e3eb5af56..3309902a8 100644 --- a/junifer/markers/complexity/multiscale_entropy_auc.py +++ b/junifer/markers/complexity/multiscale_entropy_auc.py @@ -9,7 +9,8 @@ import numpy as np from ...api.decorators import register_marker -from ...utils import logger, warn_with_log +from ...utils import warn_with_log +from ..base import logger from .complexity_base import ComplexityBase diff --git a/junifer/markers/complexity/perm_entropy.py b/junifer/markers/complexity/perm_entropy.py index f189b04e4..116312476 100644 --- a/junifer/markers/complexity/perm_entropy.py +++ b/junifer/markers/complexity/perm_entropy.py @@ -9,7 +9,8 @@ import numpy as np from ...api.decorators import register_marker -from ...utils import logger, warn_with_log +from ...utils import warn_with_log +from ..base import logger from .complexity_base import ComplexityBase diff --git a/junifer/markers/complexity/range_entropy.py b/junifer/markers/complexity/range_entropy.py index 7792af566..d820b0449 100644 --- a/junifer/markers/complexity/range_entropy.py +++ b/junifer/markers/complexity/range_entropy.py @@ -9,7 +9,8 @@ import numpy as np from ...api.decorators import register_marker -from ...utils import logger, warn_with_log +from ...utils import warn_with_log +from ..base import logger from .complexity_base import ComplexityBase diff --git a/junifer/markers/complexity/range_entropy_auc.py b/junifer/markers/complexity/range_entropy_auc.py index 0fac3d8b4..37d62affc 100644 --- a/junifer/markers/complexity/range_entropy_auc.py +++ b/junifer/markers/complexity/range_entropy_auc.py @@ -9,7 +9,8 @@ import numpy as np from ...api.decorators import register_marker -from ...utils import logger, warn_with_log +from ...utils import warn_with_log +from ..base import logger from .complexity_base import ComplexityBase diff --git a/junifer/markers/complexity/sample_entropy.py b/junifer/markers/complexity/sample_entropy.py index 66ef71ceb..81c153670 100644 --- a/junifer/markers/complexity/sample_entropy.py +++ b/junifer/markers/complexity/sample_entropy.py @@ -9,7 +9,8 @@ import numpy as np from ...api.decorators import register_marker -from ...utils import logger, warn_with_log +from ...utils import warn_with_log +from ..base import logger from .complexity_base import ComplexityBase diff --git a/junifer/markers/complexity/weighted_perm_entropy.py b/junifer/markers/complexity/weighted_perm_entropy.py index 7bc6ee167..1b0064990 100644 --- a/junifer/markers/complexity/weighted_perm_entropy.py +++ b/junifer/markers/complexity/weighted_perm_entropy.py @@ -9,7 +9,8 @@ import numpy as np from ...api.decorators import register_marker -from ...utils import logger, warn_with_log +from ...utils import warn_with_log +from ..base import logger from .complexity_base import ComplexityBase diff --git a/junifer/markers/ets_rss.py b/junifer/markers/ets_rss.py index 4dba79076..3d37b4d31 100644 --- a/junifer/markers/ets_rss.py +++ b/junifer/markers/ets_rss.py @@ -15,8 +15,8 @@ from ..datagrabber import DataType from ..storage import StorageType from ..typing import Dependencies, MarkerInOutMappings -from ..utils import ensure_list, ensure_list_or_none, logger -from .base import BaseMarker +from ..utils import ensure_list, ensure_list_or_none +from .base import BaseMarker, logger from .parcel_aggregation import ParcelAggregation from .utils import _ets diff --git a/junifer/markers/falff/_afni_falff.py b/junifer/markers/falff/_afni_falff.py index bfbaed356..a10822ec2 100644 --- a/junifer/markers/falff/_afni_falff.py +++ b/junifer/markers/falff/_afni_falff.py @@ -15,8 +15,9 @@ from ...pipeline import ExtDep, WorkDirManager from ...typing import ExternalDependencies -from ...utils import logger, run_ext_cmd +from ...utils import run_ext_cmd from ...utils.singleton import Singleton +from ..base import logger if TYPE_CHECKING: diff --git a/junifer/markers/falff/_junifer_falff.py b/junifer/markers/falff/_junifer_falff.py index c0b8c9de1..72e03ccb5 100644 --- a/junifer/markers/falff/_junifer_falff.py +++ b/junifer/markers/falff/_junifer_falff.py @@ -17,8 +17,8 @@ from ...pipeline import WorkDirManager from ...typing import Dependencies -from ...utils import logger from ...utils.singleton import Singleton +from ..base import logger if TYPE_CHECKING: diff --git a/junifer/markers/falff/falff_base.py b/junifer/markers/falff/falff_base.py index 9f37b8c11..7ea40727f 100644 --- a/junifer/markers/falff/falff_base.py +++ b/junifer/markers/falff/falff_base.py @@ -20,8 +20,8 @@ from ...datagrabber import DataType from ...storage import StorageType from ...typing import ConditionalDependencies, MarkerInOutMappings -from ...utils import ensure_list_or_none, logger -from ..base import BaseMarker +from ...utils import ensure_list_or_none +from ..base import BaseMarker, logger from ._afni_falff import AFNIALFF from ._junifer_falff import JuniferALFF diff --git a/junifer/markers/falff/falff_maps.py b/junifer/markers/falff/falff_maps.py index 720bafc23..e99eedfae 100644 --- a/junifer/markers/falff/falff_maps.py +++ b/junifer/markers/falff/falff_maps.py @@ -7,7 +7,7 @@ from ...api.decorators import register_marker from ...datagrabber import DataType -from ...utils import logger +from ..base import logger from ..maps_aggregation import MapsAggregation from .falff_base import ALFFBase diff --git a/junifer/markers/falff/falff_parcels.py b/junifer/markers/falff/falff_parcels.py index d07f4d37b..9e1245704 100644 --- a/junifer/markers/falff/falff_parcels.py +++ b/junifer/markers/falff/falff_parcels.py @@ -12,7 +12,8 @@ from ...api.decorators import register_marker from ...datagrabber import DataType -from ...utils import ensure_list, logger +from ...utils import ensure_list +from ..base import logger from ..parcel_aggregation import ParcelAggregation from .falff_base import ALFFBase diff --git a/junifer/markers/falff/falff_spheres.py b/junifer/markers/falff/falff_spheres.py index 750b8352a..082e4026d 100644 --- a/junifer/markers/falff/falff_spheres.py +++ b/junifer/markers/falff/falff_spheres.py @@ -12,7 +12,7 @@ from ...api.decorators import register_marker from ...datagrabber import DataType -from ...utils import logger +from ..base import logger from ..sphere_aggregation import SphereAggregation from .falff_base import ALFFBase diff --git a/junifer/markers/functional_connectivity/crossparcellation_functional_connectivity.py b/junifer/markers/functional_connectivity/crossparcellation_functional_connectivity.py index 83860782d..7f0604031 100644 --- a/junifer/markers/functional_connectivity/crossparcellation_functional_connectivity.py +++ b/junifer/markers/functional_connectivity/crossparcellation_functional_connectivity.py @@ -13,8 +13,8 @@ from ...datagrabber import DataType from ...storage import StorageType from ...typing import Dependencies, MarkerInOutMappings -from ...utils import ensure_list_or_none, logger, raise_error -from ..base import BaseMarker +from ...utils import ensure_list_or_none, raise_error +from ..base import BaseMarker, logger from ..parcel_aggregation import ParcelAggregation from ..utils import _correlate_dataframes diff --git a/junifer/markers/maps_aggregation.py b/junifer/markers/maps_aggregation.py index 518644c68..d463d0bfa 100644 --- a/junifer/markers/maps_aggregation.py +++ b/junifer/markers/maps_aggregation.py @@ -14,8 +14,8 @@ from ..stats import get_aggfunc_by_name from ..storage import StorageType from ..typing import Dependencies, MarkerInOutMappings -from ..utils import ensure_list_or_none, logger, raise_error, warn_with_log -from .base import BaseMarker +from ..utils import ensure_list_or_none, raise_error, warn_with_log +from .base import BaseMarker, logger __all__ = ["MapsAggregation"] diff --git a/junifer/markers/parcel_aggregation.py b/junifer/markers/parcel_aggregation.py index f236054f6..843fdc84b 100644 --- a/junifer/markers/parcel_aggregation.py +++ b/junifer/markers/parcel_aggregation.py @@ -20,11 +20,10 @@ from ..utils import ( ensure_list, ensure_list_or_none, - logger, raise_error, warn_with_log, ) -from .base import BaseMarker +from .base import BaseMarker, logger __all__ = ["ParcelAggregation"] diff --git a/junifer/markers/reho/_afni_reho.py b/junifer/markers/reho/_afni_reho.py index d529e7320..c76cda816 100644 --- a/junifer/markers/reho/_afni_reho.py +++ b/junifer/markers/reho/_afni_reho.py @@ -15,8 +15,9 @@ from ...pipeline import ExtDep, WorkDirManager from ...typing import ExternalDependencies -from ...utils import logger, run_ext_cmd +from ...utils import run_ext_cmd from ...utils.singleton import Singleton +from ..base import logger if TYPE_CHECKING: diff --git a/junifer/markers/reho/_junifer_reho.py b/junifer/markers/reho/_junifer_reho.py index a1189a8d1..95428a36b 100644 --- a/junifer/markers/reho/_junifer_reho.py +++ b/junifer/markers/reho/_junifer_reho.py @@ -19,8 +19,9 @@ from ...pipeline import WorkDirManager from ...typing import Dependencies -from ...utils import logger, raise_error +from ...utils import raise_error from ...utils.singleton import Singleton +from ..base import logger if TYPE_CHECKING: diff --git a/junifer/markers/reho/reho_base.py b/junifer/markers/reho/reho_base.py index 42c393ab4..205a16ef1 100644 --- a/junifer/markers/reho/reho_base.py +++ b/junifer/markers/reho/reho_base.py @@ -17,8 +17,8 @@ from ...datagrabber import DataType from ...storage import StorageType from ...typing import ConditionalDependencies, MarkerInOutMappings -from ...utils import ensure_list_or_none, logger -from ..base import BaseMarker +from ...utils import ensure_list_or_none +from ..base import BaseMarker, logger from ._afni_reho import AFNIReHo from ._junifer_reho import JuniferReHo diff --git a/junifer/markers/reho/reho_maps.py b/junifer/markers/reho/reho_maps.py index fc28d7d67..8a5ab0d58 100644 --- a/junifer/markers/reho/reho_maps.py +++ b/junifer/markers/reho/reho_maps.py @@ -9,7 +9,7 @@ from ...api.decorators import register_marker from ...datagrabber import DataType -from ...utils import logger +from ..base import logger from ..maps_aggregation import MapsAggregation from .reho_base import ReHoBase diff --git a/junifer/markers/reho/reho_parcels.py b/junifer/markers/reho/reho_parcels.py index b371d6016..0bb9e4928 100644 --- a/junifer/markers/reho/reho_parcels.py +++ b/junifer/markers/reho/reho_parcels.py @@ -10,7 +10,8 @@ from ...api.decorators import register_marker from ...datagrabber import DataType -from ...utils import ensure_list, logger +from ...utils import ensure_list +from ..base import logger from ..parcel_aggregation import ParcelAggregation from .reho_base import ReHoBase diff --git a/junifer/markers/reho/reho_spheres.py b/junifer/markers/reho/reho_spheres.py index f5b5671ea..ec1502798 100644 --- a/junifer/markers/reho/reho_spheres.py +++ b/junifer/markers/reho/reho_spheres.py @@ -10,7 +10,7 @@ from ...api.decorators import register_marker from ...datagrabber import DataType -from ...utils import logger +from ..base import logger from ..sphere_aggregation import SphereAggregation from .reho_base import ReHoBase diff --git a/junifer/markers/sphere_aggregation.py b/junifer/markers/sphere_aggregation.py index 3b73c3a55..229481799 100644 --- a/junifer/markers/sphere_aggregation.py +++ b/junifer/markers/sphere_aggregation.py @@ -15,8 +15,8 @@ from ..stats import get_aggfunc_by_name from ..storage import StorageType from ..typing import Dependencies, MarkerInOutMappings -from ..utils import ensure_list_or_none, logger, raise_error, warn_with_log -from .base import BaseMarker +from ..utils import ensure_list_or_none, raise_error, warn_with_log +from .base import BaseMarker, logger __all__ = ["SphereAggregation"] diff --git a/junifer/onthefly/read_transform.py b/junifer/onthefly/read_transform.py index 051c164af..b32f38d3f 100644 --- a/junifer/onthefly/read_transform.py +++ b/junifer/onthefly/read_transform.py @@ -5,13 +5,17 @@ import numpy as np import pandas as pd +import structlog from ..typing import StorageLike -from ..utils import logger, raise_error, warn_with_log +from ..utils import raise_error, warn_with_log __all__ = ["read_transform"] +_log = structlog.get_logger("junifer") +logger = _log.bind(pkg="onthefly") + def read_transform( storage: StorageLike, diff --git a/junifer/pipeline/marker_collection.py b/junifer/pipeline/marker_collection.py index 096fe6e5f..85d53a07d 100644 --- a/junifer/pipeline/marker_collection.py +++ b/junifer/pipeline/marker_collection.py @@ -7,14 +7,19 @@ from collections import Counter from pathlib import Path +import structlog + from ..datareader import DefaultDataReader from ..pipeline import DataObjectDumper, PipelineStepMixin, WorkDirManager from ..typing import DataGrabberLike, MarkerLike, PreprocessorLike, StorageLike -from ..utils import config, logger, raise_error +from ..utils import config, raise_error __all__ = ["MarkerCollection"] +_log = structlog.get_logger("junifer") +logger = _log.bind(pkg="pipeline") + class MarkerCollection: """Class for marker collection. diff --git a/junifer/pipeline/pipeline_component_registry.py b/junifer/pipeline/pipeline_component_registry.py index 0353f346c..a13723a5f 100644 --- a/junifer/pipeline/pipeline_component_registry.py +++ b/junifer/pipeline/pipeline_component_registry.py @@ -8,13 +8,18 @@ import importlib from collections.abc import Mapping +import structlog + from ..typing import DataGrabberLike, MarkerLike, PreprocessorLike, StorageLike -from ..utils import logger, raise_error +from ..utils import raise_error from ..utils.singleton import Singleton __all__ = ["PipelineComponentRegistry"] +_log = structlog.get_logger("junifer") +logger = _log.bind(pkg="pipeline") + class PipelineComponentRegistry(metaclass=Singleton): """Class for pipeline component registry. diff --git a/junifer/pipeline/tests/test_marker_collection.py b/junifer/pipeline/tests/test_marker_collection.py index 4df8f89b7..79b4fa92c 100644 --- a/junifer/pipeline/tests/test_marker_collection.py +++ b/junifer/pipeline/tests/test_marker_collection.py @@ -26,12 +26,12 @@ def test_marker_collection_incorrect_markers() -> None: """Test incorrect markers for MarkerCollection.""" wrong_markers = [ ParcelAggregation( - parcellation="Schaefer100x7", + parcellation=["Schaefer100x7"], method="mean", name="gmd_schaefer100x7_mean", ), ParcelAggregation( - parcellation="Schaefer100x7", + parcellation=["Schaefer100x7"], method="mean", name="gmd_schaefer100x7_mean", ), @@ -44,17 +44,17 @@ def test_marker_collection() -> None: """Test MarkerCollection.""" markers = [ ParcelAggregation( - parcellation="TianxS2x3TxMNInonlinear2009cAsym", + parcellation=["TianxS2x3TxMNInonlinear2009cAsym"], method="mean", name="tian_mean", ), ParcelAggregation( - parcellation="TianxS2x3TxMNInonlinear2009cAsym", + parcellation=["TianxS2x3TxMNInonlinear2009cAsym"], method="std", name="tian_std", ), ParcelAggregation( - parcellation="TianxS2x3TxMNInonlinear2009cAsym", + parcellation=["TianxS2x3TxMNInonlinear2009cAsym"], method="trim_mean", method_params={"proportiontocut": 0.1}, name="tian_trim_mean90", @@ -150,17 +150,17 @@ def test_marker_collection_storage(tmp_path: Path) -> None: """ markers = [ ParcelAggregation( - parcellation="TianxS2x3TxMNInonlinear2009cAsym", + parcellation=["TianxS2x3TxMNInonlinear2009cAsym"], method="mean", name="tian_mean", ), ParcelAggregation( - parcellation="TianxS2x3TxMNInonlinear2009cAsym", + parcellation=["TianxS2x3TxMNInonlinear2009cAsym"], method="std", name="tian_std", ), ParcelAggregation( - parcellation="TianxS2x3TxMNInonlinear2009cAsym", + parcellation=["TianxS2x3TxMNInonlinear2009cAsym"], method="trim_mean", method_params={"proportiontocut": 0.1}, name="tian_trim_mean90", diff --git a/junifer/pipeline/utils.py b/junifer/pipeline/utils.py index 1c92cc9ee..ee882c4e4 100644 --- a/junifer/pipeline/utils.py +++ b/junifer/pipeline/utils.py @@ -10,7 +10,7 @@ from pydantic import validate_call -from ..utils.logging import raise_error, warn_with_log +from ..utils import raise_error, warn_with_log __all__ = ["ExtDep", "check_ext_dependencies"] diff --git a/junifer/pipeline/workdir_manager.py b/junifer/pipeline/workdir_manager.py index dda04865b..fa4b6f91d 100644 --- a/junifer/pipeline/workdir_manager.py +++ b/junifer/pipeline/workdir_manager.py @@ -8,12 +8,16 @@ import tempfile from pathlib import Path -from ..utils import logger +import structlog + from ..utils.singleton import Singleton __all__ = ["WorkDirManager"] +_log = structlog.get_logger("junifer") +logger = _log.bind(pkg="pipeline") + class WorkDirManager(metaclass=Singleton): """Class for working directory manager. diff --git a/junifer/preprocess/_temporal_filter.py b/junifer/preprocess/_temporal_filter.py index adc018b32..8548c536d 100644 --- a/junifer/preprocess/_temporal_filter.py +++ b/junifer/preprocess/_temporal_filter.py @@ -22,8 +22,8 @@ from ..datagrabber import DataType from ..pipeline import WorkDirManager from ..typing import Dependencies -from ..utils import ensure_list_or_none, logger -from .base import BasePreprocessor +from ..utils import ensure_list_or_none +from .base import BasePreprocessor, logger __all__ = ["TemporalFilter"] diff --git a/junifer/preprocess/_temporal_slicer.py b/junifer/preprocess/_temporal_slicer.py index 486562fb3..d78de794b 100644 --- a/junifer/preprocess/_temporal_slicer.py +++ b/junifer/preprocess/_temporal_slicer.py @@ -14,8 +14,8 @@ from ..datagrabber import DataType from ..pipeline import WorkDirManager from ..typing import Dependencies -from ..utils import logger, raise_error -from .base import BasePreprocessor +from ..utils import raise_error +from .base import BasePreprocessor, logger __all__ = ["TemporalSlicer"] diff --git a/junifer/preprocess/base.py b/junifer/preprocess/base.py index c613aacee..fd84c38a5 100644 --- a/junifer/preprocess/base.py +++ b/junifer/preprocess/base.py @@ -8,15 +8,19 @@ from collections.abc import Sequence from typing import Annotated, Any, ClassVar +import structlog from pydantic import BaseModel, BeforeValidator, ConfigDict from ..datagrabber import DataType from ..pipeline import PipelineStepMixin, UpdateMetaMixin -from ..utils import ensure_list_or_none, logger, raise_error +from ..utils import ensure_list_or_none, raise_error __all__ = ["BasePreprocessor"] +_log = structlog.get_logger("junifer") +logger = _log.bind(pkg="preprocess", step="preprocessing") + class BasePreprocessor(BaseModel, ABC, PipelineStepMixin, UpdateMetaMixin): """Abstract base class for preprocessor. @@ -97,6 +101,10 @@ def model_post_init(self, context: Any): # noqa: D102 DataType(t) if isinstance(t, str) else t for t in self.required_data_types ] + logger.info( + f"Parameters: {self.model_dump(mode='json')}", + component=self.__class__.__name__, + ) @property def valid_inputs(self) -> list[DataType]: diff --git a/junifer/preprocess/confounds/fmriprep_confound_remover.py b/junifer/preprocess/confounds/fmriprep_confound_remover.py index 55d9692fa..2f48a9471 100644 --- a/junifer/preprocess/confounds/fmriprep_confound_remover.py +++ b/junifer/preprocess/confounds/fmriprep_confound_remover.py @@ -35,8 +35,8 @@ from ...datagrabber import DataType from ...pipeline import WorkDirManager from ...typing import Dependencies -from ...utils import ensure_list_or_none, logger, raise_error -from ..base import BasePreprocessor +from ...utils import ensure_list_or_none, raise_error +from ..base import BasePreprocessor, logger __all__ = ["Confounds", "Strategy", "fMRIPrepConfoundRemover"] diff --git a/junifer/preprocess/smoothing/_afni_smoothing.py b/junifer/preprocess/smoothing/_afni_smoothing.py index 0acaec78f..3f4deee3b 100644 --- a/junifer/preprocess/smoothing/_afni_smoothing.py +++ b/junifer/preprocess/smoothing/_afni_smoothing.py @@ -12,7 +12,8 @@ from ...pipeline import ExtDep, WorkDirManager from ...typing import Dependencies, ExternalDependencies -from ...utils import logger, run_ext_cmd +from ...utils import run_ext_cmd +from ..base import logger __all__ = ["AFNISmoothing"] diff --git a/junifer/preprocess/smoothing/_fsl_smoothing.py b/junifer/preprocess/smoothing/_fsl_smoothing.py index a50e33cb8..ca1ae2672 100644 --- a/junifer/preprocess/smoothing/_fsl_smoothing.py +++ b/junifer/preprocess/smoothing/_fsl_smoothing.py @@ -12,7 +12,8 @@ from ...pipeline import ExtDep, WorkDirManager from ...typing import Dependencies, ExternalDependencies -from ...utils import logger, run_ext_cmd +from ...utils import run_ext_cmd +from ..base import logger __all__ = ["FSLSmoothing"] diff --git a/junifer/preprocess/smoothing/_nilearn_smoothing.py b/junifer/preprocess/smoothing/_nilearn_smoothing.py index d9133624c..c95d218c6 100644 --- a/junifer/preprocess/smoothing/_nilearn_smoothing.py +++ b/junifer/preprocess/smoothing/_nilearn_smoothing.py @@ -15,7 +15,7 @@ from ...pipeline import WorkDirManager from ...typing import Dependencies -from ...utils import logger +from ..base import logger __all__ = ["NilearnSmoothing"] diff --git a/junifer/preprocess/smoothing/smoothing.py b/junifer/preprocess/smoothing/smoothing.py index e77c1a072..57736ae56 100644 --- a/junifer/preprocess/smoothing/smoothing.py +++ b/junifer/preprocess/smoothing/smoothing.py @@ -17,8 +17,8 @@ from ...api.decorators import register_preprocessor from ...datagrabber import DataType from ...typing import ConditionalDependencies -from ...utils import ensure_list_or_none, logger -from ..base import BasePreprocessor +from ...utils import ensure_list_or_none +from ..base import BasePreprocessor, logger from ._afni_smoothing import AFNISmoothing from ._fsl_smoothing import FSLSmoothing from ._nilearn_smoothing import NilearnSmoothing diff --git a/junifer/preprocess/warping/_ants_warper.py b/junifer/preprocess/warping/_ants_warper.py index 3b083c6d8..82878a931 100644 --- a/junifer/preprocess/warping/_ants_warper.py +++ b/junifer/preprocess/warping/_ants_warper.py @@ -14,7 +14,8 @@ from ...data import get_template, get_xfm from ...pipeline import ExtDep, WorkDirManager from ...typing import Dependencies, ExternalDependencies -from ...utils import logger, raise_error, run_ext_cmd +from ...utils import raise_error, run_ext_cmd +from ..base import logger __all__ = ["ANTsWarper"] diff --git a/junifer/preprocess/warping/_fsl_warper.py b/junifer/preprocess/warping/_fsl_warper.py index f7483b263..3ea7231b6 100644 --- a/junifer/preprocess/warping/_fsl_warper.py +++ b/junifer/preprocess/warping/_fsl_warper.py @@ -13,7 +13,8 @@ from ...pipeline import ExtDep, WorkDirManager from ...typing import Dependencies, ExternalDependencies -from ...utils import logger, raise_error, run_ext_cmd +from ...utils import raise_error, run_ext_cmd +from ..base import logger __all__ = ["FSLWarper"] diff --git a/junifer/preprocess/warping/space_warper.py b/junifer/preprocess/warping/space_warper.py index 37d16ad3a..018de8db6 100644 --- a/junifer/preprocess/warping/space_warper.py +++ b/junifer/preprocess/warping/space_warper.py @@ -13,8 +13,8 @@ from ...api.decorators import register_preprocessor from ...datagrabber import DataType from ...typing import ConditionalDependencies -from ...utils import ensure_list_or_none, logger, raise_error -from ..base import BasePreprocessor +from ...utils import ensure_list_or_none, raise_error +from ..base import BasePreprocessor, logger from ._ants_warper import ANTsWarper from ._fsl_warper import FSLWarper diff --git a/junifer/stats.py b/junifer/stats.py index dec5285fe..903a5f845 100644 --- a/junifer/stats.py +++ b/junifer/stats.py @@ -9,11 +9,12 @@ from typing import Any import numpy as np +import structlog from pydantic import validate_call from scipy.stats import mode, trim_mean from scipy.stats.mstats import winsorize -from .utils import logger, raise_error +from .utils import raise_error __all__ = [ @@ -24,6 +25,9 @@ "winsorized_mean", ] +_log = structlog.get_logger("junifer") +logger = _log.bind(pkg="stats") + class AggFunc(str, Enum): """Accepted aggregation function names. diff --git a/junifer/storage/base.py b/junifer/storage/base.py index ba9081ba3..2408cd0bf 100644 --- a/junifer/storage/base.py +++ b/junifer/storage/base.py @@ -12,9 +12,10 @@ import numpy as np import pandas as pd +import structlog from pydantic import BaseModel, ConfigDict -from ..utils import logger, raise_error +from ..utils import raise_error __all__ = ["BaseFeatureStorage", "MatrixKind", "StorageType"] @@ -28,6 +29,10 @@ class MatrixKind(str, Enum): Full = "full" +_log = structlog.get_logger("junifer") +logger = _log.bind(pkg="storage", step="storage") + + class StorageType(str, Enum): """Accepted storage type.""" @@ -79,6 +84,10 @@ def model_post_init(self, context: Any): # noqa: D102 "does not exist, creating now" ) self.uri.parent.mkdir(parents=True, exist_ok=True) + logger.info( + f"Parameters: {self.model_dump(mode='json')}", + component=self.__class__.__name__, + ) def validate_input(self, input_: list[str]) -> None: """Validate the input to the pipeline step. diff --git a/junifer/storage/hdf5.py b/junifer/storage/hdf5.py index de8b31d75..3b60a0c3e 100644 --- a/junifer/storage/hdf5.py +++ b/junifer/storage/hdf5.py @@ -22,8 +22,8 @@ read_hdf5, write_hdf5, ) -from ..utils import logger, raise_error -from .base import BaseFeatureStorage, MatrixKind, StorageType +from ..utils import raise_error +from .base import BaseFeatureStorage, MatrixKind, StorageType, logger from .utils import ( element_to_prefix, matrix_to_vector, diff --git a/junifer/storage/sqlite.py b/junifer/storage/sqlite.py index 13c40c92c..119705fd0 100644 --- a/junifer/storage/sqlite.py +++ b/junifer/storage/sqlite.py @@ -16,8 +16,8 @@ from tqdm import tqdm from ..api.decorators import register_storage -from ..utils import logger, raise_error, warn_with_log -from .base import MatrixKind +from ..utils import raise_error, warn_with_log +from .base import MatrixKind, logger from .pandas_base import PandasBaseFeatureStorage from .utils import ( element_to_prefix, diff --git a/junifer/storage/utils.py b/junifer/storage/utils.py index 0e32b2e47..d97cb0fdf 100644 --- a/junifer/storage/utils.py +++ b/junifer/storage/utils.py @@ -12,8 +12,8 @@ import numpy as np from pydantic import validate_call -from ..utils import logger, raise_error -from .base import MatrixKind +from ..utils import raise_error +from .base import MatrixKind, logger __all__ = [ diff --git a/junifer/utils/logging.py b/junifer/utils/logging.py index 17b63f8ea..f6018f715 100644 --- a/junifer/utils/logging.py +++ b/junifer/utils/logging.py @@ -111,7 +111,8 @@ def _configure_stdlib(level: int = logging.WARNING) -> None: cache_logger_on_first_use=True, ) -logger = logging.getLogger("junifer") +_log = structlog.get_logger("junifer") +logger = _log.bind(pkg="utils") # Remove datalad logger handlers to avoid duplicate logging _datalad_lgr_hdlrs = datalad.log.lgr.handlers