|
1 # loggingutil.py - utility for logging events |
|
2 # |
|
3 # Copyright 2010 Nicolas Dumazet |
|
4 # Copyright 2013 Facebook, Inc. |
|
5 # |
|
6 # This software may be used and distributed according to the terms of the |
|
7 # GNU General Public License version 2 or any later version. |
|
8 |
|
9 from __future__ import absolute_import |
|
10 |
|
11 import errno |
|
12 |
|
13 from . import ( |
|
14 pycompat, |
|
15 ) |
|
16 |
|
17 def openlogfile(ui, vfs, name, maxfiles=0, maxsize=0): |
|
18 def rotate(oldpath, newpath): |
|
19 try: |
|
20 vfs.unlink(newpath) |
|
21 except OSError as err: |
|
22 if err.errno != errno.ENOENT: |
|
23 ui.debug("warning: cannot remove '%s': %s\n" % |
|
24 (newpath, err.strerror)) |
|
25 try: |
|
26 if newpath: |
|
27 vfs.rename(oldpath, newpath) |
|
28 except OSError as err: |
|
29 if err.errno != errno.ENOENT: |
|
30 ui.debug("warning: cannot rename '%s' to '%s': %s\n" % |
|
31 (newpath, oldpath, err.strerror)) |
|
32 |
|
33 if maxsize > 0: |
|
34 try: |
|
35 st = vfs.stat(name) |
|
36 except OSError: |
|
37 pass |
|
38 else: |
|
39 if st.st_size >= maxsize: |
|
40 path = vfs.join(name) |
|
41 for i in pycompat.xrange(maxfiles - 1, 1, -1): |
|
42 rotate(oldpath='%s.%d' % (path, i - 1), |
|
43 newpath='%s.%d' % (path, i)) |
|
44 rotate(oldpath=path, |
|
45 newpath=maxfiles > 0 and path + '.1') |
|
46 return vfs(name, 'a', makeparentdirs=False) |
|
47 |
|
48 class proxylogger(object): |
|
49 """Forward log events to another logger to be set later""" |
|
50 |
|
51 def __init__(self): |
|
52 self.logger = None |
|
53 |
|
54 def tracked(self, event): |
|
55 return self.logger is not None and self.logger.tracked(event) |
|
56 |
|
57 def log(self, ui, event, msg, opts): |
|
58 assert self.logger is not None |
|
59 self.logger.log(ui, event, msg, opts) |