diff -r cb372d09d30a -r 96be0ecad648 mercurial/loggingutil.py --- a/mercurial/loggingutil.py Tue Dec 04 17:13:01 2018 -0500 +++ b/mercurial/loggingutil.py Sun Nov 18 18:58:06 2018 +0900 @@ -14,6 +14,12 @@ pycompat, ) +from .utils import ( + dateutil, + procutil, + stringutil, +) + def openlogfile(ui, vfs, name, maxfiles=0, maxsize=0): """Open log file in append mode, with optional rotation @@ -49,6 +55,58 @@ newpath=maxfiles > 0 and path + '.1') return vfs(name, 'a', makeparentdirs=False) +def _formatlogline(msg): + date = dateutil.datestr(format=b'%Y/%m/%d %H:%M:%S') + pid = procutil.getpid() + return b'%s (%d)> %s' % (date, pid, msg) + +def _matchevent(event, tracked): + return b'*' in tracked or event in tracked + +class filelogger(object): + """Basic logger backed by physical file with optional rotation""" + + def __init__(self, vfs, name, tracked, maxfiles=0, maxsize=0): + self._vfs = vfs + self._name = name + self._trackedevents = set(tracked) + self._maxfiles = maxfiles + self._maxsize = maxsize + + def tracked(self, event): + return _matchevent(event, self._trackedevents) + + def log(self, ui, event, msg, opts): + line = _formatlogline(msg) + try: + with openlogfile(ui, self._vfs, self._name, + maxfiles=self._maxfiles, + maxsize=self._maxsize) as fp: + fp.write(line) + except IOError as err: + ui.debug(b'cannot write to %s: %s\n' + % (self._name, stringutil.forcebytestr(err))) + +class fileobjectlogger(object): + """Basic logger backed by file-like object""" + + def __init__(self, fp, tracked): + self._fp = fp + self._trackedevents = set(tracked) + + def tracked(self, event): + return _matchevent(event, self._trackedevents) + + def log(self, ui, event, msg, opts): + line = _formatlogline(msg) + try: + self._fp.write(line) + self._fp.flush() + except IOError as err: + ui.debug(b'cannot write to %s: %s\n' + % (stringutil.forcebytestr(self._fp.name), + stringutil.forcebytestr(err))) + class proxylogger(object): """Forward log events to another logger to be set later"""