diff --git a/src/xfel_calibrate/setup_logging.py b/src/xfel_calibrate/setup_logging.py
index 8d1bf40ffe4655b33cdf5d822be2f7e1a325ee8c..ae8cbda320238baf334596650bc455e622cad1d4 100644
--- a/src/xfel_calibrate/setup_logging.py
+++ b/src/xfel_calibrate/setup_logging.py
@@ -44,6 +44,7 @@ def log_error(
     except Exception as e:
         sys.stdout.write(f"Logging failed: {e}\n")
 
+original_showwarning = warnings.showwarning
 
 def handle_warning(
     message: Warning, category: Type[Warning],
@@ -52,20 +53,18 @@ def handle_warning(
     file=None, line=None,
 ) -> None:
     """Log and display warnings."""
-
     try:
-        warning_info = get_log_info(str(message), category)
+        if issubclass(category, CalibrationWarning):
+            warning_info = get_log_info(str(message), category)
 
-        with open(f"warnings_{JOB_ID}.log", "a") as log_file:
-            log_file.write(json.dumps(warning_info) + "\n")
+            with open(f"warnings_{JOB_ID}.log", "a") as log_file:
+                log_file.write(json.dumps(warning_info) + "\n")
 
     except Exception as e:
-        sys.stdout.write(f"Warning logging failed: {e}\n")
+        sys.stderr.write(f"Warning logging failed: {e}\n")
     finally:
         # Ensure warning is displayed in notebook.
-        # TODO: use e.g. latex_warning from cal_tools
-        # to display colored warning textbox
-        print(f"\n{category.__name__}: {message}\n")
+        original_showwarning(message, category, filename, lineno, file, line)
 
 
 # Get IPython shell