{ "cells": [ { "cell_type": "markdown", "id": "801ebbba", "metadata": {}, "source": [ "# Log messages\n", "\n", "[![Click and Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/metadriverse/metadrive/blob/main/documentation/source/log_msg.ipynb)\n", "\n", "\n", "Logging message is important to oversee the program status. MetaDrive adopts Python's `logging` module to log messages. " ] }, { "cell_type": "markdown", "id": "443f8317", "metadata": {}, "source": [ "## Global logger \n", "We provide a wrapper in `metadrive/engine/logger` to customize some features. We recommend using it to log messages to make the logging consistent. It is a global variable, so you can get the logger at anywhere of your code. Some classes like `BaseEnv` may have a variable called `logger` as well, which is actually the same as the global logger." ] }, { "cell_type": "code", "execution_count": null, "id": "a08dffbc", "metadata": {}, "outputs": [], "source": [ "from metadrive.envs.base_env import BaseEnv\n", "from metadrive.engine.logger import get_logger # get_logger\n", "\n", "logger = get_logger()\n", "\n", "# create environment\n", "logger.info(\"Create environment\\n\")\n", "env = BaseEnv(dict(use_render=False))\n", "assert logger is env.logger # the environment.logger is the same as global logger\n", "\n", "# reset environment\n", "logger.info(\"Reset environment\")\n", "env.reset()\n", "try:\n", " for i in range(5):\n", " logger.info(\"Simulate step {}\".format(i))\n", " env.step(env.action_space.sample())\n", "finally:\n", " logger.info(\"Close environment\")\n", " env.close()\n" ] }, { "cell_type": "markdown", "id": "a8f87467", "metadata": {}, "source": [ "The logger can be used at everywhere. For example, it can be used in your manager." ] }, { "cell_type": "code", "execution_count": null, "id": "39443673", "metadata": {}, "outputs": [], "source": [ "from metadrive.envs.base_env import BaseEnv\n", "from metadrive.engine.logger import get_logger # get_logger\n", "from metadrive.manager.base_manager import BaseManager\n", "\n", "logger = get_logger()\n", "\n", "class MyMgr(BaseManager):\n", " \n", " def __init__(self):\n", " super(MyMgr, self).__init__()\n", " logger.info(\"Init MyMgr...\")\n", " \n", " def after_step(self, *args, **kwargs):\n", " logger.info(\"Step {}...\".format(self.episode_step))\n", " return dict()\n", "\n", "\n", "# create environment\n", "env = BaseEnv(dict(use_render=False))\n", "\n", "# reset environment\n", "env.reset()\n", "\n", "# add manager\n", "env.engine.register_manager(\"my_mgr\", MyMgr())\n", "try:\n", " for i in range(5):\n", " env.step(env.action_space.sample())\n", "finally:\n", " env.close()" ] }, { "cell_type": "markdown", "id": "98b765f0", "metadata": {}, "source": [ "## Log level\n", "Similar to `logging` module, one can change the log level to decide which log messages to be printed. Generally, MetaDrive uses `logging.INFO`, `logging.DEBUG`, and `logging.WARNING` to classify log messages. By default, the log level is `logging.INFO` and thus debug messages will be hidden. The log level can be set in environment config. The following example shows how to print more debug message by setting `log_level=logging.DEBUG`. In addition, if `debug=True` in the environment config, the log level will be set to `logging.DEBUG` as well. " ] }, { "cell_type": "code", "execution_count": null, "id": "0c77a550", "metadata": {}, "outputs": [], "source": [ "from metadrive.envs.base_env import BaseEnv\n", "import logging\n", "from metadrive.engine.logger import get_logger # get_logger\n", "\n", "logger = get_logger()\n", "\n", "# create environment\n", "env = BaseEnv(dict(use_render=False, log_level=logging.DEBUG))\n", "assert logger is env.logger # the environment.logger is the same as global logger\n", "\n", "# reset environment\n", "logger.debug(\"Reset environment\")\n", "env.reset()\n", "try:\n", " for i in range(5):\n", " logger.debug(\"Simulate step {}\".format(i))\n", " env.step(env.action_space.sample())\n", "finally:\n", " logger.debug(\"Close environment\")\n", " env.close()" ] }, { "cell_type": "markdown", "id": "312cc6dc", "metadata": {}, "source": [ "If you would like to turn off all log messages, changing the log_level to `logging.WARNING` (or `logging.CRITICAL`) can suppress messages logged by `logging.info()`, `logging.debug()` (or even `logging.warn`)." ] }, { "cell_type": "code", "execution_count": null, "id": "ed56a0c4", "metadata": {}, "outputs": [], "source": [ "from metadrive.engine.logger import set_log_level # get_logger\n", "\n", "def run(): # define the simulation loop\n", " # reset environment\n", " logger.debug(\"Reset environment\")\n", " env.reset()\n", " try:\n", " for i in range(5):\n", " logger.debug(\"Simulate step {}\".format(i))\n", " env.step(env.action_space.sample())\n", " finally:\n", " logger.debug(\"Close environment\")\n", " env.close()\n", "\n", "set_log_level(logging.WARNING) # Or set it in environment config\n", "run()\n", "\n", "\n", "print(\"Turn off all messages...\") \n", "\n", "set_log_level(logging.CRITICAL) # Or set it in environment config\n", "run()" ] }, { "cell_type": "markdown", "id": "3c3e6834", "metadata": {}, "source": [ "## Log once\n", "Sometimes, we may want the message to be logged only once in one episode. In this case, we can use the `log_once` key to notify the logger to show some messages only once until the next `reset` is called." ] }, { "cell_type": "code", "execution_count": null, "id": "28b15685", "metadata": {}, "outputs": [], "source": [ "from metadrive.envs.base_env import BaseEnv\n", "import logging\n", "\n", "# create environment\n", "env = BaseEnv(dict(use_render=False, log_level=logging.CRITICAL))\n", "\n", "# reset environment\n", "env.reset()\n", "try:\n", " for i in range(5):\n", " env.logger.critical(\"Step... (I will only show once)\".format(i), extra={\"log_once\": True})\n", " env.step(env.action_space.sample())\n", "finally:\n", " env.close()\n" ] } ], "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.7.13" }, "mystnb": { "execution_mode": "force" } }, "nbformat": 4, "nbformat_minor": 5 }