summary refs log tree commit diff
path: root/dot_ipython/profile_default/startup/20_logging.py
diff options
context:
space:
mode:
authorAlen <alen@dotfiles.xyz>2023-09-25 21:32:05 +0400
committerAlen <alen@dotfiles.xyz>2023-09-25 21:32:05 +0400
commit4b8ed94012af1fb4f4752b5d199f79c6bcfd4c59 (patch)
treead54d702d385e973f367cc02c9115b1948510caa /dot_ipython/profile_default/startup/20_logging.py
parent33df3ffbe31ea3b722bfeec21e6a4ebfd038aa00 (diff)
Add basic IPython config and startup scripts
Diffstat (limited to 'dot_ipython/profile_default/startup/20_logging.py')
-rw-r--r--dot_ipython/profile_default/startup/20_logging.py111
1 files changed, 111 insertions, 0 deletions
diff --git a/dot_ipython/profile_default/startup/20_logging.py b/dot_ipython/profile_default/startup/20_logging.py
new file mode 100644
index 0000000..86ef226
--- /dev/null
+++ b/dot_ipython/profile_default/startup/20_logging.py
@@ -0,0 +1,111 @@
+"""Set some (hopefully) sane and comfortable logging defaults."""
+
+import logging
+
+
+def _setup() -> logging.Logger:
+    import logging
+    import os
+    import setuptools
+    import glob
+
+    # Determine log levels
+    project_level = getattr(logging, os.environ.get("LOG_LEVEL", "INFO"))
+    root_level = getattr(logging, os.environ.get("ROOT_LOG_LEVEL", "WARNING"))
+    root_level = max(project_level, root_level)
+
+    # Determine projects
+    project_names = (
+        ["__main__", "repl"]
+        + [x[:-3] for x in glob.glob("*.py")]
+        + setuptools.find_packages()
+    )
+
+    # Set logging levels
+    logging.root.setLevel(root_level)
+    for name in project_names:
+        logging.getLogger(name).setLevel(project_level)
+
+    # Configure logging format
+    try:
+        from colorlog import ColoredFormatter
+    except ModuleNotFoundError:
+        formatter = logging.Formatter(
+            "\u001b[36m%(asctime)s "
+            "\u001b[0m%(levelname)-8s "
+            "\u001b[32m%(threadName)s "
+            "\u001b[36m%(name)s "
+            "\u001b[37;1m%(message)s"
+            "\u001b[0m",
+            datefmt="%H:%M",
+        )
+    else:
+
+        class FancyFormatter(logging.Formatter):
+            """Formatter that uses a different formatter for debug logs."""
+
+            def __init__(
+                self,
+                formatter: logging.Formatter,
+                debug_formatter: logging.Formatter,
+            ) -> None:
+                super().__init__()
+                self.formatter = formatter
+                self.debug_formatter = debug_formatter
+
+            def format(
+                self,
+                record: logging.LogRecord,
+            ) -> str:
+                if record.levelno <= logging.DEBUG:
+                    return self.debug_formatter.format(record)
+                return self.formatter.format(record)
+
+        fmt = (
+            "%(cyan)s%(asctime)s "
+            "%(log_color)s%(levelname)-8s "
+            "%(green)s%(threadName)s "
+            "%(cyan)s%(name)s "
+            "%(white)s%(message)s"
+        )
+        formatter = FancyFormatter(
+            formatter=ColoredFormatter(
+                fmt=fmt,
+                datefmt="%H:%M",
+                reset=True,
+                log_colors={
+                    "DEBUG": "white",
+                    "INFO": "white",
+                    "WARNING": "yellow",
+                    "ERROR": "red",
+                    "CRITICAL": "bold_red",
+                },
+            ),
+            debug_formatter=ColoredFormatter(
+                fmt=f"%(thin)s{fmt}",
+                datefmt="%H:%M",
+                reset=True,
+                log_colors={
+                    "DEBUG": "white",
+                    "INFO": "white",
+                    "WARNING": "yellow",
+                    "ERROR": "red",
+                    "CRITICAL": "bold_red",
+                },
+            ),
+        )
+
+    # Create root handler with formatter
+    handler = logging.StreamHandler()
+    handler.setFormatter(formatter)
+    if not logging.root.handlers:
+        logging.root.addHandler(handler)
+
+    return logging.getLogger("repl")
+
+
+logger = _setup()
+
+del _setup
+
+_summarise_startup()