import logging
from typing import TYPE_CHECKING
from agentlib.core import environment
if TYPE_CHECKING:
from agentlib import Environment
[docs]class CustomLogger(logging.Logger):
"""Subclass of Logger that adds the env_time to the record, allowing it to print
the current time."""
def __init__(self, name, env: "Environment", level=logging.NOTSET):
super().__init__(name, level)
self.env = env
[docs] def makeRecord(
self,
name,
level,
fn,
lno,
msg,
args,
exc_info,
func=None,
extra=None,
sinfo=None,
):
record = super().makeRecord(
name, level, fn, lno, msg, args, exc_info, func, extra, sinfo
)
_until = self.env.pretty_until()
_time = self.env.pretty_time()
if _until is environment.UNTIL_UNSET:
# Add "INIT" prefix to clearly indicate initialization phase
record.env_time = f"<INIT>"
elif _until is None:
record.env_time = _time
else:
record.env_time = _time + "/" + _until
return record
[docs]def create_logger(env: "Environment", name: str) -> CustomLogger:
"""Creates a logger that displays the environment time when logging."""
# Create a custom logger
custom_logger = CustomLogger(name, env=env)
custom_logger.setLevel(logging.root.getEffectiveLevel())
# Create a formatter
formatter = logging.Formatter("%(env_time)s %(levelname)s: %(name)s: %(message)s")
# Create a StreamHandler and add it to the logger
stream_handler = logging.StreamHandler()
stream_handler.setFormatter(formatter)
custom_logger.addHandler(stream_handler)
# Check if root logger has any FileHandlers and add similar ones to our custom logger
for handler in logging.root.handlers:
if isinstance(handler, logging.FileHandler):
# Create a similar FileHandler for our custom logger
file_handler = logging.FileHandler(
handler.baseFilename, mode=handler.mode, encoding=handler.encoding
)
file_handler.setFormatter(formatter)
file_handler.setLevel(handler.level)
custom_logger.addHandler(file_handler)
return custom_logger