Source code for duo_ai.utils.logging
import logging
import sys
import traceback
from datetime import datetime
[docs]def configure_logging(log_file):
"""
Configure logging to output to both a file and the console with elapsed time formatting.
Sets up logging handlers and a custom exception hook for uncaught exceptions.
Parameters
----------
log_file : str
Path to the log file where logs will be written.
Returns
-------
None
Examples
--------
>>> configure_logging('experiment.log')
"""
stream_handler = logging.StreamHandler()
stream_handler.setFormatter(ElapsedFormatter())
file_handler = logging.FileHandler(log_file)
file_handler.setFormatter(ElapsedFormatter())
logging.basicConfig(
level=logging.INFO, handlers=[file_handler, stream_handler], force=True
)
def handler(type, value, tb):
logging.exception("Uncaught exception: %s", str(value))
logging.exception("\n".join(traceback.format_exception(type, value, tb)))
sys.excepthook = handler
[docs]class ElapsedFormatter:
"""
Formatter for logging that prepends elapsed time since initialization.
Parameters
----------
None
Attributes
----------
start_time : datetime.datetime
The time when the formatter was initialized.
Examples
--------
>>> formatter = ElapsedFormatter()
>>> formatter.format_time(datetime.now() - formatter.start_time)
'0:00:01'
"""
def __init__(self):
"""
Initialize the ElapsedFormatter and record the start time.
Returns
-------
None
"""
self.start_time = datetime.now()
[docs] def format_time(self, t):
"""
Format a timedelta as a string, omitting microseconds.
Parameters
----------
t : datetime.timedelta
Time difference to format.
Returns
-------
str
Formatted time string.
"""
return str(t)[:-7]
[docs] def format(self, record):
"""
Format a log record with elapsed time and log level.
Parameters
----------
record : logging.LogRecord
The log record to format.
Returns
-------
str
Formatted log string.
"""
elapsed_time = self.format_time(datetime.now() - self.start_time)
log_str = "[%s %s]: %s" % (elapsed_time, record.levelname, record.getMessage())
return log_str