1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 """\
21 X2goLogger class - flexible handling of log and debug output.
22
23 """
24 __NAME__ = 'x2gologger-pylib'
25
26
27 import os
28 import sys
29
30 loglevel_NONE = 0
31 loglevel_ERROR = 8
32 loglevel_WARN = 16
33 loglevel_NOTICE = 32
34 loglevel_INFO = 64
35 loglevel_DEBUG = 128
36 loglevel_DEBUG_SFTPXFER = 1024
37
38 loglevel_DEFAULT = loglevel_ERROR | loglevel_WARN | loglevel_NOTICE
39 """\
40 Default loglevel of X2goLogger objects is: NOTICE & WARN & ERROR
41 """
42
43
44 import utils
45
47 """\
48 A simple logger class, that is used by all Python X2go classes.
49
50 """
51 name = ''
52 tag = ''
53 progpid = -1
54 level = -1
55 destination = sys.stderr
56
57 _loglevel_NAMES = {8: 'error',
58 16: 'warn',
59 32: 'notice',
60 64: 'info',
61 128: 'debug',
62 1024: 'debug-sftpxfer',
63 }
64
66 """\
67 @param name: name of the programme that uses Python X2go
68 @type name: C{str}
69 @param loglevel: log level for Python X2go
70 @type loglevel: C{int}
71 @param tag: additional tag for all log entries
72 @type tag: C{str}
73
74 """
75 self.name = os.path.basename(name)
76 self.tag = tag
77 self.loglevel = loglevel
78 self.progpid = os.getpid()
79
81 """\
82 Log a message.
83
84 @param msg: log message text
85 @type msg: C{str}
86 @param loglevel: log level of this message
87 @type loglevel: C{int}
88 @param tag: additional tag for this log entry
89 @type tag: C{str}
90
91 """
92 if tag is None:
93 tag = self.tag
94 if loglevel & self.loglevel:
95
96 msg = msg.replace('\n', ' ')
97 msg = msg.encode(utils.get_encoding())
98
99 if self.tag is not None:
100 self.destination.write('%s[%s] (%s) %s: %s\n' % (self.name, self.progpid, tag, self._loglevel_NAMES[loglevel].upper(), msg))
101 else:
102 self.destination.write('%s[%s] %s: %s\n' % (self.name, self.progpid, self._loglevel_NAMES[loglevel].upper(), msg))
103 __call__ = message
104
106 """\
107 Get the current loglevel.
108
109 @return: current log level
110 @rtype: C{int}
111
112 """
113 return self.loglevel
114
116 """\
117 Set log level by name.
118
119 @param loglevel_name: name of loglevel to be set
120 @type loglevel_name: C{str}
121
122 """
123 if type(loglevel_name) is types.IntegerType:
124 self.loglevel = loglevel_name
125 elif type(loglevel_name) is types.StringType and loglevel_name in self._loglevel_NAMES.values():
126 _method = getattr(self, 'self.set_loglevel_%s' % loglevel_name)
127 _method()
128 else:
129 self.loglevel = loglevel_DEFAULT
130
132 """\
133 Silence logging completely.
134
135 """
136 self.loglevel = 0
137
139 """\
140 Set log level to I{ERROR}.
141
142 """
143 self.loglevel = loglevel_ERROR
144
151
158
165
172
174 """\
175 Additionally, switch on sFTP data transfer debugging
176
177 """
178 self.loglevel = self.loglevel | loglevel_DEBUG_SFTPXFER
179
181 """\
182 Switch off sFTP data transfer debugging.
183
184 """
185 self.loglevel = self.loglevel ^ loglevel_DEBUG_SFTPXFER
186