Skip to content

debug log #967

@manuelep

Description

@manuelep

It seems that the logger created using the make_logger helper requires an additional logger.setLevel('DEBUG') to properly log messages below the warning level.

You can verify this by running the following code, which currently only displays the warning message.

To fix this, simply add root.setLevel(10) before return root in make_logger, and it will work as expected!

import logging
import os
import sys

def make_logger(name, loggers_info):
    """
    Abstraction layer for logging. Example usage:

    from py4web.server_adapters.logging_utils import make_logger

    loggers_info = [
        "warning:warning.log",
        "info:info.log",
        "debug:debug.log:$(asctime)s > %(levelname)s > %(message)s",
    ]

    logger = make_logger("py4web:appname", loggers_info)
    """
    default_formatter = (
        "%(asctime)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s"
    )
    # Reset loggers
    root = logging.getLogger(name)
    list(map(root.removeHandler, root.handlers))
    list(map(root.removeFilter, root.filters))
    
    for logger in loggers_info:
        logger += ":stderr" if logger.count(":") == 0 else ""
        logger += ":" if logger.count(":") == 1 else ""
        level, filename, formatter = logger.split(":", 2)
        if not formatter:
            formatter = default_formatter
        handler = (
            logging.StreamHandler(getattr(sys, filename))
            if filename in ("stdout", "stderr")
            else logging.FileHandler(filename)
        )
        handler.setFormatter(logging.Formatter(formatter))
        handler.setLevel(getattr(logging, level.upper(), "DEBUG"))
        root.addHandler(handler)

    root.setLevel(10)  # Ensure all log levels are captured
    return root

THIS_FILE_NAME = os.path.splitext(os.path.basename(__file__))[0]
THIS_FILE_PATH, THIS_FILE_FULL_NAME = os.path.split(__file__)
THIS_FILE_NAME, _ = os.path.splitext(THIS_FILE_FULL_NAME)
LOG_FILE = os.path.join(THIS_FILE_PATH, f'{THIS_FILE_NAME}.log')

LOGGERS = [
    "debug:stdout",
]  # Syntax: "severity:filename:format", where filename can be stderr or stdout

logger = make_logger(f'script:{THIS_FILE_NAME}', LOGGERS)

logger.debug('Debugging')  # This won't appear without root.setLevel(10)
logger.warning("It's a warning!")

Let me know if you'd like any further refinements!

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions