47 newpath='%s.%d' % (path, i)) |
53 newpath='%s.%d' % (path, i)) |
48 rotate(oldpath=path, |
54 rotate(oldpath=path, |
49 newpath=maxfiles > 0 and path + '.1') |
55 newpath=maxfiles > 0 and path + '.1') |
50 return vfs(name, 'a', makeparentdirs=False) |
56 return vfs(name, 'a', makeparentdirs=False) |
51 |
57 |
|
58 def _formatlogline(msg): |
|
59 date = dateutil.datestr(format=b'%Y/%m/%d %H:%M:%S') |
|
60 pid = procutil.getpid() |
|
61 return b'%s (%d)> %s' % (date, pid, msg) |
|
62 |
|
63 def _matchevent(event, tracked): |
|
64 return b'*' in tracked or event in tracked |
|
65 |
|
66 class filelogger(object): |
|
67 """Basic logger backed by physical file with optional rotation""" |
|
68 |
|
69 def __init__(self, vfs, name, tracked, maxfiles=0, maxsize=0): |
|
70 self._vfs = vfs |
|
71 self._name = name |
|
72 self._trackedevents = set(tracked) |
|
73 self._maxfiles = maxfiles |
|
74 self._maxsize = maxsize |
|
75 |
|
76 def tracked(self, event): |
|
77 return _matchevent(event, self._trackedevents) |
|
78 |
|
79 def log(self, ui, event, msg, opts): |
|
80 line = _formatlogline(msg) |
|
81 try: |
|
82 with openlogfile(ui, self._vfs, self._name, |
|
83 maxfiles=self._maxfiles, |
|
84 maxsize=self._maxsize) as fp: |
|
85 fp.write(line) |
|
86 except IOError as err: |
|
87 ui.debug(b'cannot write to %s: %s\n' |
|
88 % (self._name, stringutil.forcebytestr(err))) |
|
89 |
|
90 class fileobjectlogger(object): |
|
91 """Basic logger backed by file-like object""" |
|
92 |
|
93 def __init__(self, fp, tracked): |
|
94 self._fp = fp |
|
95 self._trackedevents = set(tracked) |
|
96 |
|
97 def tracked(self, event): |
|
98 return _matchevent(event, self._trackedevents) |
|
99 |
|
100 def log(self, ui, event, msg, opts): |
|
101 line = _formatlogline(msg) |
|
102 try: |
|
103 self._fp.write(line) |
|
104 self._fp.flush() |
|
105 except IOError as err: |
|
106 ui.debug(b'cannot write to %s: %s\n' |
|
107 % (stringutil.forcebytestr(self._fp.name), |
|
108 stringutil.forcebytestr(err))) |
|
109 |
52 class proxylogger(object): |
110 class proxylogger(object): |
53 """Forward log events to another logger to be set later""" |
111 """Forward log events to another logger to be set later""" |
54 |
112 |
55 def __init__(self): |
113 def __init__(self): |
56 self.logger = None |
114 self.logger = None |