annotate mercurial/loggingutil.py @ 46892:4a6024b87dfc

blackbox: fix type error on log rotation on read-only filesystem Grepping around, the code uses either encoding.strtolocal or stringutil.forcebytestr in this situation. No idea which is best. Differential Revision: https://phab.mercurial-scm.org/D10293
author Valentin Gatien-Baron <vgatien-baron@janestreet.com>
date Wed, 31 Mar 2021 17:54:02 -0400
parents 687b865b95ad
children 6000f5b25c9b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
40799
03127e580980 loggingutil: extract openlogfile() and proxylogger to new module
Yuya Nishihara <yuya@tcha.org>
parents: 40798
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
1506eb487ddd blackbox: fix copyright
Bryan O'Sullivan <bryano@fb.com>
parents: 18675
diff changeset
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
46892
4a6024b87dfc blackbox: fix type error on log rotation on read-only filesystem
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 43077
diff changeset
13 from . import (
4a6024b87dfc blackbox: fix type error on log rotation on read-only filesystem
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 43077
diff changeset
14 encoding,
4a6024b87dfc blackbox: fix type error on log rotation on read-only filesystem
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 43077
diff changeset
15 pycompat,
4a6024b87dfc blackbox: fix type error on log rotation on read-only filesystem
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 43077
diff changeset
16 )
18669
18242716a014 blackbox: adds a blackbox extension
Durham Goode <durham@fb.com>
parents:
diff changeset
17
40821
96be0ecad648 loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents: 40800
diff changeset
18 from .utils import (
96be0ecad648 loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents: 40800
diff changeset
19 dateutil,
96be0ecad648 loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents: 40800
diff changeset
20 procutil,
96be0ecad648 loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents: 40800
diff changeset
21 stringutil,
96be0ecad648 loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents: 40800
diff changeset
22 )
96be0ecad648 loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents: 40800
diff changeset
23
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40821
diff changeset
24
40799
03127e580980 loggingutil: extract openlogfile() and proxylogger to new module
Yuya Nishihara <yuya@tcha.org>
parents: 40798
diff changeset
25 def openlogfile(ui, vfs, name, maxfiles=0, maxsize=0):
40800
698477777883 loggingutil: document openlogfile()
Yuya Nishihara <yuya@tcha.org>
parents: 40799
diff changeset
26 """Open log file in append mode, with optional rotation
698477777883 loggingutil: document openlogfile()
Yuya Nishihara <yuya@tcha.org>
parents: 40799
diff changeset
27
698477777883 loggingutil: document openlogfile()
Yuya Nishihara <yuya@tcha.org>
parents: 40799
diff changeset
28 If maxsize > 0, the log file will be rotated up to maxfiles.
698477777883 loggingutil: document openlogfile()
Yuya Nishihara <yuya@tcha.org>
parents: 40799
diff changeset
29 """
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40821
diff changeset
30
34300
e6723c939344 blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents: 34299
diff changeset
31 def rotate(oldpath, newpath):
e6723c939344 blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents: 34299
diff changeset
32 try:
e6723c939344 blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents: 34299
diff changeset
33 vfs.unlink(newpath)
e6723c939344 blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents: 34299
diff changeset
34 except OSError as err:
e6723c939344 blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents: 34299
diff changeset
35 if err.errno != errno.ENOENT:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40821
diff changeset
36 ui.debug(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
37 b"warning: cannot remove '%s': %s\n"
46892
4a6024b87dfc blackbox: fix type error on log rotation on read-only filesystem
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 43077
diff changeset
38 % (newpath, encoding.strtolocal(err.strerror))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40821
diff changeset
39 )
34300
e6723c939344 blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents: 34299
diff changeset
40 try:
e6723c939344 blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents: 34299
diff changeset
41 if newpath:
e6723c939344 blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents: 34299
diff changeset
42 vfs.rename(oldpath, newpath)
e6723c939344 blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents: 34299
diff changeset
43 except OSError as err:
e6723c939344 blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents: 34299
diff changeset
44 if err.errno != errno.ENOENT:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40821
diff changeset
45 ui.debug(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
46 b"warning: cannot rename '%s' to '%s': %s\n"
46892
4a6024b87dfc blackbox: fix type error on log rotation on read-only filesystem
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 43077
diff changeset
47 % (newpath, oldpath, encoding.strtolocal(err.strerror))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40821
diff changeset
48 )
34300
e6723c939344 blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents: 34299
diff changeset
49
e6723c939344 blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents: 34299
diff changeset
50 if maxsize > 0:
e6723c939344 blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents: 34299
diff changeset
51 try:
e6723c939344 blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents: 34299
diff changeset
52 st = vfs.stat(name)
e6723c939344 blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents: 34299
diff changeset
53 except OSError:
e6723c939344 blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents: 34299
diff changeset
54 pass
e6723c939344 blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents: 34299
diff changeset
55 else:
e6723c939344 blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents: 34299
diff changeset
56 if st.st_size >= maxsize:
e6723c939344 blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents: 34299
diff changeset
57 path = vfs.join(name)
38783
e7aa113b14f7 global: use pycompat.xrange()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37120
diff changeset
58 for i in pycompat.xrange(maxfiles - 1, 1, -1):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40821
diff changeset
59 rotate(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
60 oldpath=b'%s.%d' % (path, i - 1),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
61 newpath=b'%s.%d' % (path, i),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40821
diff changeset
62 )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
63 rotate(oldpath=path, newpath=maxfiles > 0 and path + b'.1')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
64 return vfs(name, b'a', makeparentdirs=False)
34300
e6723c939344 blackbox: move _openlogfile to a separate method
Jun Wu <quark@fb.com>
parents: 34299
diff changeset
65
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40821
diff changeset
66
40821
96be0ecad648 loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents: 40800
diff changeset
67 def _formatlogline(msg):
96be0ecad648 loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents: 40800
diff changeset
68 date = dateutil.datestr(format=b'%Y/%m/%d %H:%M:%S')
96be0ecad648 loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents: 40800
diff changeset
69 pid = procutil.getpid()
96be0ecad648 loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents: 40800
diff changeset
70 return b'%s (%d)> %s' % (date, pid, msg)
96be0ecad648 loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents: 40800
diff changeset
71
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40821
diff changeset
72
40821
96be0ecad648 loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents: 40800
diff changeset
73 def _matchevent(event, tracked):
96be0ecad648 loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents: 40800
diff changeset
74 return b'*' in tracked or event in tracked
96be0ecad648 loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents: 40800
diff changeset
75
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40821
diff changeset
76
40821
96be0ecad648 loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents: 40800
diff changeset
77 class filelogger(object):
96be0ecad648 loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents: 40800
diff changeset
78 """Basic logger backed by physical file with optional rotation"""
96be0ecad648 loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents: 40800
diff changeset
79
96be0ecad648 loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents: 40800
diff changeset
80 def __init__(self, vfs, name, tracked, maxfiles=0, maxsize=0):
96be0ecad648 loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents: 40800
diff changeset
81 self._vfs = vfs
96be0ecad648 loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents: 40800
diff changeset
82 self._name = name
96be0ecad648 loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents: 40800
diff changeset
83 self._trackedevents = set(tracked)
96be0ecad648 loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents: 40800
diff changeset
84 self._maxfiles = maxfiles
96be0ecad648 loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents: 40800
diff changeset
85 self._maxsize = maxsize
96be0ecad648 loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents: 40800
diff changeset
86
96be0ecad648 loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents: 40800
diff changeset
87 def tracked(self, event):
96be0ecad648 loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents: 40800
diff changeset
88 return _matchevent(event, self._trackedevents)
96be0ecad648 loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents: 40800
diff changeset
89
96be0ecad648 loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents: 40800
diff changeset
90 def log(self, ui, event, msg, opts):
96be0ecad648 loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents: 40800
diff changeset
91 line = _formatlogline(msg)
96be0ecad648 loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents: 40800
diff changeset
92 try:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40821
diff changeset
93 with openlogfile(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40821
diff changeset
94 ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40821
diff changeset
95 self._vfs,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40821
diff changeset
96 self._name,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40821
diff changeset
97 maxfiles=self._maxfiles,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40821
diff changeset
98 maxsize=self._maxsize,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40821
diff changeset
99 ) as fp:
40821
96be0ecad648 loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents: 40800
diff changeset
100 fp.write(line)
96be0ecad648 loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents: 40800
diff changeset
101 except IOError as err:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40821
diff changeset
102 ui.debug(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40821
diff changeset
103 b'cannot write to %s: %s\n'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40821
diff changeset
104 % (self._name, stringutil.forcebytestr(err))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40821
diff changeset
105 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40821
diff changeset
106
40821
96be0ecad648 loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents: 40800
diff changeset
107
96be0ecad648 loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents: 40800
diff changeset
108 class fileobjectlogger(object):
96be0ecad648 loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents: 40800
diff changeset
109 """Basic logger backed by file-like object"""
96be0ecad648 loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents: 40800
diff changeset
110
96be0ecad648 loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents: 40800
diff changeset
111 def __init__(self, fp, tracked):
96be0ecad648 loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents: 40800
diff changeset
112 self._fp = fp
96be0ecad648 loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents: 40800
diff changeset
113 self._trackedevents = set(tracked)
96be0ecad648 loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents: 40800
diff changeset
114
96be0ecad648 loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents: 40800
diff changeset
115 def tracked(self, event):
96be0ecad648 loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents: 40800
diff changeset
116 return _matchevent(event, self._trackedevents)
96be0ecad648 loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents: 40800
diff changeset
117
96be0ecad648 loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents: 40800
diff changeset
118 def log(self, ui, event, msg, opts):
96be0ecad648 loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents: 40800
diff changeset
119 line = _formatlogline(msg)
96be0ecad648 loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents: 40800
diff changeset
120 try:
96be0ecad648 loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents: 40800
diff changeset
121 self._fp.write(line)
96be0ecad648 loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents: 40800
diff changeset
122 self._fp.flush()
96be0ecad648 loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents: 40800
diff changeset
123 except IOError as err:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40821
diff changeset
124 ui.debug(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40821
diff changeset
125 b'cannot write to %s: %s\n'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40821
diff changeset
126 % (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40821
diff changeset
127 stringutil.forcebytestr(self._fp.name),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40821
diff changeset
128 stringutil.forcebytestr(err),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40821
diff changeset
129 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40821
diff changeset
130 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40821
diff changeset
131
40821
96be0ecad648 loggingutil: add basic logger backends
Yuya Nishihara <yuya@tcha.org>
parents: 40800
diff changeset
132
40762
37d6ee46a965 blackbox: extract global last logger to proxylogger class
Yuya Nishihara <yuya@tcha.org>
parents: 40760
diff changeset
133 class proxylogger(object):
37d6ee46a965 blackbox: extract global last logger to proxylogger class
Yuya Nishihara <yuya@tcha.org>
parents: 40760
diff changeset
134 """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: 40760
diff changeset
135
37d6ee46a965 blackbox: extract global last logger to proxylogger class
Yuya Nishihara <yuya@tcha.org>
parents: 40760
diff changeset
136 def __init__(self):
37d6ee46a965 blackbox: extract global last logger to proxylogger class
Yuya Nishihara <yuya@tcha.org>
parents: 40760
diff changeset
137 self.logger = None
37d6ee46a965 blackbox: extract global last logger to proxylogger class
Yuya Nishihara <yuya@tcha.org>
parents: 40760
diff changeset
138
37d6ee46a965 blackbox: extract global last logger to proxylogger class
Yuya Nishihara <yuya@tcha.org>
parents: 40760
diff changeset
139 def tracked(self, event):
37d6ee46a965 blackbox: extract global last logger to proxylogger class
Yuya Nishihara <yuya@tcha.org>
parents: 40760
diff changeset
140 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: 40760
diff changeset
141
37d6ee46a965 blackbox: extract global last logger to proxylogger class
Yuya Nishihara <yuya@tcha.org>
parents: 40760
diff changeset
142 def log(self, ui, event, msg, opts):
37d6ee46a965 blackbox: extract global last logger to proxylogger class
Yuya Nishihara <yuya@tcha.org>
parents: 40760
diff changeset
143 assert self.logger is not None
37d6ee46a965 blackbox: extract global last logger to proxylogger class
Yuya Nishihara <yuya@tcha.org>
parents: 40760
diff changeset
144 self.logger.log(ui, event, msg, opts)