diff --git a/src/agora/abc.py b/src/agora/abc.py
index 85bf4f3d2999cec4f301e4fc7aa5a96ae932a630..6c1fd343e04bf42fb798642484b0b55c2de0a97a 100644
--- a/src/agora/abc.py
+++ b/src/agora/abc.py
@@ -200,6 +200,11 @@ class ProcessABC(ABC):
     def run(self):
         pass
 
+    def _log(self, message: str, level: str = "warn"):
+        # Log messages in the corresponding level
+        logger = logging.getLogger("aliby")
+        getattr(logger, level)(f"{self.__class__.__name__}: {message}")
+
 
 def check_type_recursive(val1, val2):
     same_types = True
@@ -230,10 +235,6 @@ class StepABC(ProcessABC):
     def __init__(self, *args, **kwargs):
         super().__init__(*args, **kwargs)
 
-    @property
-    def _logger(self):
-        return logging.getLogger("aliby")
-
     @abstractmethod
     def _run_tp(self):
         pass
@@ -245,8 +246,9 @@ class StepABC(ProcessABC):
         if log:
             t = perf_counter()
             result = self._run_tp(tp, **kwargs)
-            self._logger.debug(
-                f"Timing:{self.__class__.__name__}:{perf_counter()-t}s"
+            self._log(
+                f"Timing:{self.__class__.__name__}:{perf_counter()-t}s",
+                "debug",
             )
         else:
             result = self._run_tp(tp, **kwargs)
diff --git a/src/aliby/pipeline.py b/src/aliby/pipeline.py
index 1c6a03aa4f5cb7792525560f2ac7a21ac924e265..dc1512c1c8579c743a1653061af60692a09e9715 100644
--- a/src/aliby/pipeline.py
+++ b/src/aliby/pipeline.py
@@ -499,14 +499,14 @@ class Pipeline(ProcessABC):
                             frac_clogged_traps = self.check_earlystop(
                                 filename, earlystop, steps["tiler"].tile_size
                             )
-                            logging.warn(
+                            self._log(
                                 f"{name}:Clogged_traps:{frac_clogged_traps}"
                             )
 
                             frac = np.round(frac_clogged_traps * 100)
                             pbar.set_postfix_str(f"{frac} Clogged")
                         else:  # Stop if more than X% traps are clogged
-                            self._logger.warn(
+                            self._log(
                                 f"{name}:Analysis stopped early at time {i} with {frac_clogged_traps} clogged traps"
                             )
                             meta.add_fields({"end_status": "Clogged"})
@@ -521,7 +521,7 @@ class Pipeline(ProcessABC):
                     )
                     PostProcessor(filename, post_proc_params).run()
 
-                    self._logger.info("Analysis finished successfully.")
+                    self._log("Analysis finished successfully.", "info")
                     return 1
 
         except Exception as e:  # bug during setup or runtime
@@ -678,7 +678,7 @@ class Pipeline(ProcessABC):
 
             # If no previous segmentation and keep tiler
             if filename.exists():
-                self._logger.warn("IO: Result file exists.")
+                self._log("Result file exists.", "info")
                 if not ow["tiler"]:
                     steps["tiler"] = Tiler.from_hdf5(image, filename)
                     try: