diff --git a/.gitignore b/.gitignore
index 1ede23b52f37829bc92f9b6064d13b577b08f6c4..1bb0e882a78f648f548b25151e4493d23e700fbe 100644
--- a/.gitignore
+++ b/.gitignore
@@ -14,4 +14,7 @@ build/
 *.swp
 *.swo
 *.pyc
-*~
\ No newline at end of file
+*~
+
+# Notebook checkpoints
+.ipynb_checkpoints/
diff --git a/docs/notebooks/.ipynb_checkpoints/Logging-checkpoint.ipynb b/docs/notebooks/.ipynb_checkpoints/Logging-checkpoint.ipynb
deleted file mode 100644
index f5f70327dd168af03ed0fbc60efc762872271e63..0000000000000000000000000000000000000000
--- a/docs/notebooks/.ipynb_checkpoints/Logging-checkpoint.ipynb
+++ /dev/null
@@ -1,220 +0,0 @@
-{
- "cells": [
-  {
-   "cell_type": "markdown",
-   "id": "ae2a75fe",
-   "metadata": {},
-   "source": [
-    "# Logging system for qim3d\n",
-    "\n",
-    "Using proper logging instead of print statements is a recommended practice.\n",
-    "\n",
-    "While print statements can be helpful for quick debugging, logging provides a more powerful and versatile approach. Logging allows for better control over output, with options to configure log levels, filter messages, and redirect output to different destinations. \n"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 1,
-   "id": "a31b2245",
-   "metadata": {
-    "slideshow": {
-     "slide_type": ""
-    },
-    "tags": []
-   },
-   "outputs": [],
-   "source": [
-    "import qim3d\n",
-    "from qim3d.io.logger import log"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 2,
-   "id": "94022824",
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "warning level message\n",
-      "error level message\n",
-      "critical level message\n"
-     ]
-    }
-   ],
-   "source": [
-    "# Here we test by sending one message for each level\n",
-    "# Note that DEBUG and INFO do not appear\n",
-    "log.debug('debug level message')\n",
-    "log.info('info level message')\n",
-    "log.warning('warning level message')\n",
-    "log.error('error level message')\n",
-    "log.critical('critical level message')"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 3,
-   "id": "b0856333",
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "debug level message\n",
-      "info level message\n",
-      "warning level message\n",
-      "error level message\n",
-      "critical level message\n"
-     ]
-    }
-   ],
-   "source": [
-    "# Change the level to debug\n",
-    "qim3d.io.logger.set_level_DEBUG()\n",
-    "\n",
-    "# Now all the levels get logged\n",
-    "log.debug('debug level message')\n",
-    "log.info('info level message')\n",
-    "log.warning('warning level message')\n",
-    "log.error('error level message')\n",
-    "log.critical('critical level message')"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 4,
-   "id": "eb542404",
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "error level message\n",
-      "critical level message\n"
-     ]
-    }
-   ],
-   "source": [
-    "# Change the level to error\n",
-    "qim3d.io.logger.set_level_ERROR()\n",
-    "\n",
-    "# And now only above ERROR is shown\n",
-    "log.debug('debug level message')\n",
-    "log.info('info level message')\n",
-    "log.warning('warning level message')\n",
-    "log.error('error level message')\n",
-    "log.critical('critical level message')"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 5,
-   "id": "af3cc812",
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "ERROR     3224913348.py:8    error level message\n",
-      "CRITICAL  3224913348.py:9    critical level message\n"
-     ]
-    }
-   ],
-   "source": [
-    "# We can increase the level of detail\n",
-    "qim3d.io.logger.set_detailed_output()\n",
-    "\n",
-    "# Note that DEBUG and INFO are still not shown\n",
-    "log.debug('debug level message')\n",
-    "log.info('info level message')\n",
-    "log.warning('warning level message')\n",
-    "log.error('error level message')\n",
-    "log.critical('critical level message')"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 6,
-   "id": "d7239b1b",
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "error level message\n",
-      "critical level message\n"
-     ]
-    }
-   ],
-   "source": [
-    "# We can switch back to the simple output mode\n",
-    "qim3d.io.logger.set_simple_output()\n",
-    "\n",
-    "# Now we see all the levels on simple mode\n",
-    "log.debug('debug level message')\n",
-    "log.info('info level message')\n",
-    "log.warning('warning level message')\n",
-    "log.error('error level message')\n",
-    "log.critical('critical level message')"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 7,
-   "id": "eaceb5b6",
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "DEBUG     4221232047.py:5    debug level message\n",
-      "INFO      4221232047.py:6    info level message\n",
-      "WARNING   4221232047.py:7    warning level message\n",
-      "ERROR     4221232047.py:8    error level message\n",
-      "CRITICAL  4221232047.py:9    critical level message\n"
-     ]
-    }
-   ],
-   "source": [
-    "# Change back to detailed and DEBUG level\n",
-    "qim3d.io.logger.set_detailed_output()\n",
-    "qim3d.io.logger.set_level_DEBUG()\n",
-    "\n",
-    "log.debug('debug level message')\n",
-    "log.info('info level message')\n",
-    "log.warning('warning level message')\n",
-    "log.error('error level message')\n",
-    "log.critical('critical level message')"
-   ]
-  }
- ],
- "metadata": {
-  "kernelspec": {
-   "display_name": "Python 3 (ipykernel)",
-   "language": "python",
-   "name": "python3"
-  },
-  "language_info": {
-   "codemirror_mode": {
-    "name": "ipython",
-    "version": 3
-   },
-   "file_extension": ".py",
-   "mimetype": "text/x-python",
-   "name": "python",
-   "nbconvert_exporter": "python",
-   "pygments_lexer": "ipython3",
-   "version": "3.10.6"
-  }
- },
- "nbformat": 4,
- "nbformat_minor": 5
-}
diff --git a/docs/notebooks/Logging.ipynb b/docs/notebooks/Logging.ipynb
index f5f70327dd168af03ed0fbc60efc762872271e63..d4584e857a15a2d17bcdfe71c36993679572a92a 100644
--- a/docs/notebooks/Logging.ipynb
+++ b/docs/notebooks/Logging.ipynb
@@ -74,7 +74,7 @@
    ],
    "source": [
     "# Change the level to debug\n",
-    "qim3d.io.logger.set_level_DEBUG()\n",
+    "qim3d.io.logger.level(\"debug\")\n",
     "\n",
     "# Now all the levels get logged\n",
     "log.debug('debug level message')\n",
@@ -101,7 +101,7 @@
    ],
    "source": [
     "# Change the level to error\n",
-    "qim3d.io.logger.set_level_ERROR()\n",
+    "qim3d.io.logger.level(\"error\")\n",
     "\n",
     "# And now only above ERROR is shown\n",
     "log.debug('debug level message')\n",
@@ -175,18 +175,18 @@
      "name": "stderr",
      "output_type": "stream",
      "text": [
-      "DEBUG     4221232047.py:5    debug level message\n",
-      "INFO      4221232047.py:6    info level message\n",
-      "WARNING   4221232047.py:7    warning level message\n",
-      "ERROR     4221232047.py:8    error level message\n",
-      "CRITICAL  4221232047.py:9    critical level message\n"
+      "DEBUG     1186198911.py:5    debug level message\n",
+      "INFO      1186198911.py:6    info level message\n",
+      "WARNING   1186198911.py:7    warning level message\n",
+      "ERROR     1186198911.py:8    error level message\n",
+      "CRITICAL  1186198911.py:9    critical level message\n"
      ]
     }
    ],
    "source": [
     "# Change back to detailed and DEBUG level\n",
     "qim3d.io.logger.set_detailed_output()\n",
-    "qim3d.io.logger.set_level_DEBUG()\n",
+    "qim3d.io.logger.level(\"debug\")\n",
     "\n",
     "log.debug('debug level message')\n",
     "log.info('info level message')\n",
diff --git a/qim3d/io/logger.py b/qim3d/io/logger.py
index d81774feb633bc61b8556c6b0300a4ed6b80de39..6e3fb203f1b701f90c218f675c60f9ea99a757e7 100644
--- a/qim3d/io/logger.py
+++ b/qim3d/io/logger.py
@@ -41,6 +41,45 @@ def set_level_CRITICAL():
     logging.getLogger("qim3d").setLevel(logging.CRITICAL)
 
 
+def level(level):
+    """Set the logging level based on the specified level.
+
+    Args:
+        level (str or int): The logging level to set. It can be one of the following:
+            - "DEBUG" or "debug": Set the logging level to DEBUG.
+            - "INFO" or "info": Set the logging level to INFO.
+            - "WARNING" or "warning": Set the logging level to WARNING.
+            - "ERROR" or "error": Set the logging level to ERROR.
+            - "CRITICAL" or "critical": Set the logging level to CRITICAL.
+            - int: Set the logging level using the numeric value of the level (e.g., logging.DEBUG).
+
+    Raises:
+        ValueError: If the specified level is not a valid logging level.
+
+    """
+    if level in ["DEBUG", "debug"]:
+        set_level_DEBUG()
+
+    elif level in ["INFO", "info"]:
+        set_level_INFO()
+
+    elif level in ["WARNING", "warning"]:
+        set_level_WARNING()
+
+    elif level in ["ERROR", "error"]:
+        set_level_ERROR()
+
+    elif level in ["CRITICAL", "critical"]:
+        set_level_CRITICAL()
+
+    elif isinstance(level, int):
+        logging.getLogger("qim3d").setLevel(level)
+
+    else:
+        raise ValueError(
+            f"Invalid logging level: '{level}'.\nPlease use 'debug', 'info', 'warning', 'error', 'critical' or an int."
+        )
+
 
 # create the logger
 log = logging.getLogger("qim3d")