5 `Loggers` is a collection of logggers for :class:`~moe.eval.Eval`, initializing 4 subloggers (see class description).
7 Use as `e.log.debug(...)` for main log that goes both to `test` and `main` log,
8 `e.log.test.debug(...)` for individual logs.
11 Very verbose debugging level
16 main log, initially a duplicated fd 2 (stderr)
18 public progress log, initially a duplicated fd 1 (stdout)
20 per-test log, initially no handler, to be directed to file like `{TEST}.log`
22 .. note:: Currently, the logs and fd's get never closed.
23 .. warning:: `Loggers.open_eval_log` changes global fd's 1 and 2 by default.
27 # Global logs to be imported by every module
29 __all__ = ['log', 'userlog', 'testlog', 'pipelog' ]
37 orig_stdout_file = None
39 orig_stderr_file = None
45 """Very basic loggers setup to stderr."""
47 global orig_stdout_fd, orig_stdout_file, orig_stderr_fd, orig_stderr_file
50 orig_stdout_fd = os.dup(1)
51 orig_stdout_file = os.fdopen(orig_stdout_fd, 'w', 0)
52 orig_stderr_fd = os.dup(2)
53 orig_stderr_file = os.fdopen(orig_stderr_fd, 'w', 0)
55 log = logging.getLogger('mainlog')
56 log.addHandler(StreamHandler(orig_stderr_file))
58 userlog = logging.getLogger('userlog')
59 userlog.addHandler(StreamHandler(orig_stdout_file))
64 logging.addLevelName(5,'DDEBUG')
66 log.debug('Logging initialized.')
69 def open_user_log(filename, level=logging.INFO):
70 """Open user (progress) logfile. Leaves logging to stdout active."""
71 h = StreamHandler(open(filename, 'w', 0))
72 h.setFormatter(Formatter('%(message)s'))
73 userlog.setLevel(level)
76 log.debug('User logging to %r started', filename)
78 def open_eval_log(filename, redirect_fds = True):
80 Leaves logging to stderr active. If told to, redirects fd's 1 and 2 to this file."""
82 eval_file = open(filename, 'w', 0)
83 h = StreamHandler(self.eval_file)
84 h.setFormatter(Formatter('%(asctime)s [%(levelno)s] %(message)s'))
86 log.debug('Opened eval logfile %r')
89 os.dup2(eval_file.fileno(), 1)
90 os.dup2(eval_file.fileno(), 2)
91 log.debug('Redirected fds 1,2 -> eval logfile')
94 def open_test_log(filename, level):
95 """Open per-test log file, usually "{TEST}.log", set its level."""
97 log.debug('Opening per-test log %r', filename)
99 global testlog, testlog_file
100 assert testlog_file is None
102 testlog = logging.getLogger('testlog')
103 testlog.setLevel(level)
104 for h in testlog.handlers:
105 testlog.removeHandler(h)
107 testlog_file = open(filename, 'w')
108 h = StreamHandler(self.testlog_file)
109 h.setFormatter(Formatter('%(asctime)s [%(levelno)s] %(message)s'))
110 testlog.addHandler(h)
112 testlog.debug('Logging started')
114 def close_test_log():
115 """Close per-test logfile, set `testlog` to `log`."""
116 assert testlog_file is not None