#!/usr/bin/env python
+"""
+
+`Loggers` is a collection of logggers for :class:`~moe.eval.Eval`, initializing 4 subloggers (see class description).
+
+Use as `e.log.debug(...)` for main log that goes both to `test` and `main` log,
+`e.log.test.debug(...)` for individual logs.
+
+.. :data:: DDEBUG = 5
+ Very verbose debugging level
+
+"""
+
+
import sys, os
import logging
-from logging import Logger, StreamHandler
+from logging import Logger, StreamHandler, Formatter
+
+logging.addLevelName(5,'DDEBUG')
class Loggers(Logger):
`self.test`
per-test log, initially no handler, to be directed to file like `{TEST}.log`
- Currently, the logs and fd's get never closed.
-
- TODO: formatters
- WARN: Currently, the module changes fd's 1 and 2, this is a global change.
+ .. note:: Currently, the logs and fd's get never closed.
+ .. warning:: `Loggers.open_eval_log` changes global fd's 1 and 2 by default.
"""
def __init__(self):
"Initialize loggers as described in class description."
self.test_file = None
# user progress logger
self.user = Logger('user')
- self.eval.addHandler(StreamHandler(self.orig_stdout_file))
+ self.user.addHandler(StreamHandler(self.orig_stdout_file))
self.addHandler(self.test)
self.addHandler(self.eval)
"""Open user (progress) logfile. Leaves logging to stdout active."""
h = StreamHandler(open(filename, 'w', 0))
h.setFormatter(Formatter('%(message)s'))
+ self.user.setLevel(level)
self.user.addHandler(h)
self.user.debug('Logging started')
def open_eval_log(self, filename, level, redirect_fds = True):
- """Open user (progress) logfile.
- Leaves logging to stderr active. If told to, redirects fd's 1 and 2 to this file."""
+ """Open main logfile.
+ Leaves logging to stderr active. If told to, redirects fd's 1 and 2 to this file.
+ Sets level of both `self.eval` and `self`."""
self.eval_file = open(filename, 'w', 0)
self.eval_handler = StreamHandler(self.eval_file)
- self.eval_handler.setFormatter(Formatter('%(message)s'))
- self.user.addHandler(self.eval_handler)
+ self.eval_handler.setFormatter(Formatter('%(asctime)s [%(levelno)s] %(message)s'))
+ self.eval.addHandler(self.eval_handler)
if redirect_fds:
os.dup2(self.eval_file.fileno(), 1)
os.dup2(self.eval_file.fileno(), 2)
- self.user.debug('Logging started')
+ self.eval.setLevel(level)
+ self.setLevel(level)
+ self.eval.debug('Logging started')
+
def open_test_log(self, filename, level):
"""Open per-test log file, like "{TEST}.log". Also set handler level to `level`."""