mercurial/loggingutil.py
changeset 40821 96be0ecad648
parent 40800 698477777883
child 43076 2372284d9457
--- 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"""