diff options
Diffstat (limited to 'common/stdlog.py')
-rw-r--r-- | common/stdlog.py | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/common/stdlog.py b/common/stdlog.py new file mode 100644 index 0000000..3d8063c --- /dev/null +++ b/common/stdlog.py @@ -0,0 +1,106 @@ +import sys, os +from time import localtime, ctime + + +class LogFile: + + def __init__(self, filename=None, limitsize=32768): + if filename is None: + filename = sys.argv[0] + if filename.endswith('.py'): + filename = filename[:-3] + filename += '.log' + self.limitsize = limitsize + if not self._open(filename): + import tempfile + filename = os.path.join(tempfile.gettempdir(), + os.path.basename(filename)) + if not self._open(filename): + self.f = self.filename = None + self.lasttime = None + + def close(self): + if self.f is not None: + self.f.close() + self.f = None + + def __nonzero__(self): + return self.f is not None + + def _open(self, filename): + try: + self.f = open(filename, 'r+', 1) + self.f.seek(0, 2) + except IOError: + # The open r+ might have failed simply because the file + # does not exist. Try to create it. + try: + self.f = open(filename, 'w+', 1) + except (OSError, IOError): + return 0 + except OSError: + return 0 + self.filename = filename + if self.f.tell() > 0: + print >> self.f + print >> self.f, '='*44 + return 1 + + def _check(self): + if self.f is None: + return 0 + lt = localtime() + if lt[:4] != self.lasttime: + self.lasttime = lt[:4] + if self.f.tell() >= self.limitsize: + self.f.seek(-(self.limitsize>>1), 1) + data = self.f.read() + self.f.seek(0) + self.f.write('(...)' + data) + self.f.truncate() + self.f.write('========= %s =========\n' % ctime()) + return 1 + + def write(self, data): + if self._check(): + self.f.write(data) + + def writelines(self, data): + if self._check(): + self.f.writelines(data) + + def flush(self): + if self._check(): + self.f.flush() + + +class Logger: + stdout_captured = 0 + stderr_captured = 0 + + def __init__(self, f): + self.targets = [f] + + def capture_stdout(self): + if not Logger.stdout_captured: + self.targets.append(sys.stdout) + sys.stdout = self + Logger.stdout_captured = 1 + + def capture_stderr(self): + if not Logger.stderr_captured: + self.targets.append(sys.stderr) + sys.stderr = self + Logger.stderr_captured = 1 + + def write(self, data): + for f in self.targets: + f.write(data) + + def writelines(self, data): + for f in self.targets: + f.writelines(data) + + def flush(self): + for f in self.targets: + f.flush() |