1
2
3
4
5
6
7
8
9
10
11 import Globals
12 import logging
13 import traceback
14 from decorator import decorator
15 from Products.ZenUtils.Utils import zenPath
20 self.loggedFunctions = set()
21 self.config()
22
23 - def config(self, repeat=False, fileName='deprecated.log', delay=True, propagate=True):
24 """
25 Initialize or change the behavior of @deprecated.
26
27 @param repeat: Log every time the same deprecated function is called, or just once?
28 @type repeat: boolean
29 @param fileName: Name of the file, or None for no file.
30 @type fileName: string
31 @param delay: Prevent creating the log file until used?
32 @type delay: boolean
33 @param propagate: Also log to current file/screen?
34 @type propagate: boolean
35 """
36 self.log = logging.getLogger('zen.deprecated')
37
38 if self.log.handlers:
39 self.log.removeHandler(self.log.handlers[0])
40
41 self.repeat = repeat
42 self.log.propagate = propagate
43 if fileName:
44 filePath = zenPath('log', fileName)
45 handler = logging.FileHandler(filePath, delay=delay)
46
47 formatter = logging.Formatter('%(asctime)s %(levelname)s %(name)s: %(message)s')
48 handler.setFormatter(formatter)
49 self.log.addHandler(handler)
50 else:
51 self.log.addHandler(logging.NullHandler())
52
54 if self.repeat or not func in self.loggedFunctions:
55
56
57
58 stack = ''.join(traceback.format_stack()[:-3])
59 self.log.warn(
60 "Call to deprecated function %s\nSource: %s:%d\nTraceback:%s",
61 func.__name__,
62 func.func_code.co_filename,
63 func.func_code.co_firstlineno + 1,
64 stack)
65
66 self.loggedFunctions.add(func)
67
69 DeprecatedLogger = DeprecatedLogger()
70
71
72 @decorator
73 -def deprecated(func, *args, **kwargs):
74 """
75 This can be used to mark functions as deprecated.
76 If the function is used it will log a warning to the current
77 log file and $ZENHOME/log/deprecated.log
78 """
79 if Globals.DevelopmentMode:
80 DeprecatedLogger.logFunction(func)
81
82 return func(*args, **kwargs)
83