author | Ian Moody <moz-ian@perix.co.uk> |
Tue, 16 Jul 2019 19:18:16 +0100 | |
changeset 42618 | c17e6a3e7356 |
parent 40839 | 96be0ecad648 |
child 43076 | 2372284d9457 |
permissions | -rw-r--r-- |
40828
03127e580980
loggingutil: extract openlogfile() and proxylogger to new module
Yuya Nishihara <yuya@tcha.org>
parents:
40827
diff
changeset
|
1 |
# loggingutil.py - utility for logging events |
18669
18242716a014
blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff
changeset
|
2 |
# |
18676 | 3 |
# Copyright 2010 Nicolas Dumazet |
18669
18242716a014
blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff
changeset
|
4 |
# Copyright 2013 Facebook, Inc. |
18242716a014
blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff
changeset
|
5 |
# |
18242716a014
blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff
changeset
|
6 |
# This software may be used and distributed according to the terms of the |
18242716a014
blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff
changeset
|
7 |
# GNU General Public License version 2 or any later version. |
18242716a014
blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff
changeset
|
8 |
|
28090
8113c88b8e6d
blackbox: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28027
diff
changeset
|
9 |
from __future__ import absolute_import |
8113c88b8e6d
blackbox: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28027
diff
changeset
|
10 |
|
8113c88b8e6d
blackbox: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28027
diff
changeset
|
11 |
import errno |
8113c88b8e6d
blackbox: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28027
diff
changeset
|
12 |
|
40828
03127e580980
loggingutil: extract openlogfile() and proxylogger to new module
Yuya Nishihara <yuya@tcha.org>
parents:
40827
diff
changeset
|
13 |
from . import ( |
38823
e7aa113b14f7
global: use pycompat.xrange()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37123
diff
changeset
|
14 |
pycompat, |
37123
a8a902d7176e
procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36636
diff
changeset
|
15 |
) |
18669
18242716a014
blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff
changeset
|
16 |
|
40839
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
17 |
from .utils import ( |
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
18 |
dateutil, |
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
19 |
procutil, |
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
20 |
stringutil, |
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
21 |
) |
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
22 |
|
40828
03127e580980
loggingutil: extract openlogfile() and proxylogger to new module
Yuya Nishihara <yuya@tcha.org>
parents:
40827
diff
changeset
|
23 |
def openlogfile(ui, vfs, name, maxfiles=0, maxsize=0): |
40829
698477777883
loggingutil: document openlogfile()
Yuya Nishihara <yuya@tcha.org>
parents:
40828
diff
changeset
|
24 |
"""Open log file in append mode, with optional rotation |
698477777883
loggingutil: document openlogfile()
Yuya Nishihara <yuya@tcha.org>
parents:
40828
diff
changeset
|
25 |
|
698477777883
loggingutil: document openlogfile()
Yuya Nishihara <yuya@tcha.org>
parents:
40828
diff
changeset
|
26 |
If maxsize > 0, the log file will be rotated up to maxfiles. |
698477777883
loggingutil: document openlogfile()
Yuya Nishihara <yuya@tcha.org>
parents:
40828
diff
changeset
|
27 |
""" |
34307
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34306
diff
changeset
|
28 |
def rotate(oldpath, newpath): |
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34306
diff
changeset
|
29 |
try: |
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34306
diff
changeset
|
30 |
vfs.unlink(newpath) |
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34306
diff
changeset
|
31 |
except OSError as err: |
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34306
diff
changeset
|
32 |
if err.errno != errno.ENOENT: |
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34306
diff
changeset
|
33 |
ui.debug("warning: cannot remove '%s': %s\n" % |
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34306
diff
changeset
|
34 |
(newpath, err.strerror)) |
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34306
diff
changeset
|
35 |
try: |
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34306
diff
changeset
|
36 |
if newpath: |
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34306
diff
changeset
|
37 |
vfs.rename(oldpath, newpath) |
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34306
diff
changeset
|
38 |
except OSError as err: |
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34306
diff
changeset
|
39 |
if err.errno != errno.ENOENT: |
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34306
diff
changeset
|
40 |
ui.debug("warning: cannot rename '%s' to '%s': %s\n" % |
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34306
diff
changeset
|
41 |
(newpath, oldpath, err.strerror)) |
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34306
diff
changeset
|
42 |
|
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34306
diff
changeset
|
43 |
if maxsize > 0: |
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34306
diff
changeset
|
44 |
try: |
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34306
diff
changeset
|
45 |
st = vfs.stat(name) |
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34306
diff
changeset
|
46 |
except OSError: |
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34306
diff
changeset
|
47 |
pass |
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34306
diff
changeset
|
48 |
else: |
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34306
diff
changeset
|
49 |
if st.st_size >= maxsize: |
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34306
diff
changeset
|
50 |
path = vfs.join(name) |
38823
e7aa113b14f7
global: use pycompat.xrange()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37123
diff
changeset
|
51 |
for i in pycompat.xrange(maxfiles - 1, 1, -1): |
34307
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34306
diff
changeset
|
52 |
rotate(oldpath='%s.%d' % (path, i - 1), |
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34306
diff
changeset
|
53 |
newpath='%s.%d' % (path, i)) |
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34306
diff
changeset
|
54 |
rotate(oldpath=path, |
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34306
diff
changeset
|
55 |
newpath=maxfiles > 0 and path + '.1') |
40826
ea2688c84e4b
blackbox: just try writing to repo.vfs and update lastlogger on success
Yuya Nishihara <yuya@tcha.org>
parents:
40798
diff
changeset
|
56 |
return vfs(name, 'a', makeparentdirs=False) |
34307
e6723c939344
blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents:
34306
diff
changeset
|
57 |
|
40839
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
58 |
def _formatlogline(msg): |
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
59 |
date = dateutil.datestr(format=b'%Y/%m/%d %H:%M:%S') |
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
60 |
pid = procutil.getpid() |
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
61 |
return b'%s (%d)> %s' % (date, pid, msg) |
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
62 |
|
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
63 |
def _matchevent(event, tracked): |
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
64 |
return b'*' in tracked or event in tracked |
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
65 |
|
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
66 |
class filelogger(object): |
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
67 |
"""Basic logger backed by physical file with optional rotation""" |
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
68 |
|
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
69 |
def __init__(self, vfs, name, tracked, maxfiles=0, maxsize=0): |
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
70 |
self._vfs = vfs |
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
71 |
self._name = name |
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
72 |
self._trackedevents = set(tracked) |
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
73 |
self._maxfiles = maxfiles |
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
74 |
self._maxsize = maxsize |
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
75 |
|
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
76 |
def tracked(self, event): |
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
77 |
return _matchevent(event, self._trackedevents) |
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
78 |
|
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
79 |
def log(self, ui, event, msg, opts): |
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
80 |
line = _formatlogline(msg) |
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
81 |
try: |
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
82 |
with openlogfile(ui, self._vfs, self._name, |
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
83 |
maxfiles=self._maxfiles, |
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
84 |
maxsize=self._maxsize) as fp: |
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
85 |
fp.write(line) |
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
86 |
except IOError as err: |
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
87 |
ui.debug(b'cannot write to %s: %s\n' |
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
88 |
% (self._name, stringutil.forcebytestr(err))) |
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
89 |
|
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
90 |
class fileobjectlogger(object): |
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
91 |
"""Basic logger backed by file-like object""" |
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
92 |
|
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
93 |
def __init__(self, fp, tracked): |
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
94 |
self._fp = fp |
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
95 |
self._trackedevents = set(tracked) |
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
96 |
|
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
97 |
def tracked(self, event): |
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
98 |
return _matchevent(event, self._trackedevents) |
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
99 |
|
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
100 |
def log(self, ui, event, msg, opts): |
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
101 |
line = _formatlogline(msg) |
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
102 |
try: |
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
103 |
self._fp.write(line) |
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
104 |
self._fp.flush() |
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
105 |
except IOError as err: |
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
106 |
ui.debug(b'cannot write to %s: %s\n' |
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
107 |
% (stringutil.forcebytestr(self._fp.name), |
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
108 |
stringutil.forcebytestr(err))) |
96be0ecad648
loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents:
40829
diff
changeset
|
109 |
|
40796
37d6ee46a965
blackbox: extract global last logger to proxylogger class
Yuya Nishihara <yuya@tcha.org>
parents:
40794
diff
changeset
|
110 |
class proxylogger(object): |
37d6ee46a965
blackbox: extract global last logger to proxylogger class
Yuya Nishihara <yuya@tcha.org>
parents:
40794
diff
changeset
|
111 |
"""Forward log events to another logger to be set later""" |
37d6ee46a965
blackbox: extract global last logger to proxylogger class
Yuya Nishihara <yuya@tcha.org>
parents:
40794
diff
changeset
|
112 |
|
37d6ee46a965
blackbox: extract global last logger to proxylogger class
Yuya Nishihara <yuya@tcha.org>
parents:
40794
diff
changeset
|
113 |
def __init__(self): |
37d6ee46a965
blackbox: extract global last logger to proxylogger class
Yuya Nishihara <yuya@tcha.org>
parents:
40794
diff
changeset
|
114 |
self.logger = None |
37d6ee46a965
blackbox: extract global last logger to proxylogger class
Yuya Nishihara <yuya@tcha.org>
parents:
40794
diff
changeset
|
115 |
|
37d6ee46a965
blackbox: extract global last logger to proxylogger class
Yuya Nishihara <yuya@tcha.org>
parents:
40794
diff
changeset
|
116 |
def tracked(self, event): |
37d6ee46a965
blackbox: extract global last logger to proxylogger class
Yuya Nishihara <yuya@tcha.org>
parents:
40794
diff
changeset
|
117 |
return self.logger is not None and self.logger.tracked(event) |
37d6ee46a965
blackbox: extract global last logger to proxylogger class
Yuya Nishihara <yuya@tcha.org>
parents:
40794
diff
changeset
|
118 |
|
37d6ee46a965
blackbox: extract global last logger to proxylogger class
Yuya Nishihara <yuya@tcha.org>
parents:
40794
diff
changeset
|
119 |
def log(self, ui, event, msg, opts): |
37d6ee46a965
blackbox: extract global last logger to proxylogger class
Yuya Nishihara <yuya@tcha.org>
parents:
40794
diff
changeset
|
120 |
assert self.logger is not None |
37d6ee46a965
blackbox: extract global last logger to proxylogger class
Yuya Nishihara <yuya@tcha.org>
parents:
40794
diff
changeset
|
121 |
self.logger.log(ui, event, msg, opts) |