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")