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 import types
30
31 loglevel_NONE = 0
32 loglevel_ERROR = 8
33 loglevel_WARN = 16
34 loglevel_NOTICE = 32
35 loglevel_INFO = 64
36 loglevel_DEBUG = 128
37 loglevel_DEBUG_SFTPXFER = 1024
38
39 loglevel_DEFAULT = loglevel_ERROR | loglevel_WARN | loglevel_NOTICE
40 """\
41 Default loglevel of X2goLogger objects is: NOTICE & WARN & ERROR
42 """
43
44
45 import utils
46
48 """\
49 A simple logger class, that is used by all Python X2Go classes.
50
51 """
52 name = ''
53 tag = ''
54 progpid = -1
55 level = -1
56 destination = sys.stderr
57
58 _loglevel_NAMES = {8: 'error',
59 16: 'warn',
60 32: 'notice',
61 64: 'info',
62 128: 'debug',
63 1024: 'debug-sftpxfer',
64 }
65
67 """\
68 @param name: name of the programme that uses Python X2go
69 @type name: C{str}
70 @param loglevel: log level for Python X2go
71 @type loglevel: C{int}
72 @param tag: additional tag for all log entries
73 @type tag: C{str}
74
75 """
76 self.name = os.path.basename(name)
77 self.tag = tag
78 self.loglevel = loglevel
79 self.progpid = os.getpid()
80
82 """\
83 Log a message.
84
85 @param msg: log message text
86 @type msg: C{str}
87 @param loglevel: log level of this message
88 @type loglevel: C{int}
89 @param tag: additional tag for this log entry
90 @type tag: C{str}
91
92 """
93 if tag is None:
94 tag = self.tag
95 if loglevel & self.loglevel:
96
97 msg = msg.replace('\n', ' ')
98 msg = msg.encode(utils.get_encoding())
99
100 if self.tag is not None:
101 self.destination.write('%s[%s] (%s) %s: %s\n' % (self.name, self.progpid, tag, self._loglevel_NAMES[loglevel].upper(), msg))
102 else:
103 self.destination.write('%s[%s] %s: %s\n' % (self.name, self.progpid, self._loglevel_NAMES[loglevel].upper(), msg))
104 __call__ = message
105
107 """\
108 Get the current loglevel.
109
110 @return: current log level
111 @rtype: C{int}
112
113 """
114 return self.loglevel
115
117 """\
118 Set log level by name.
119
120 @param loglevel_name: name of loglevel to be set
121 @type loglevel_name: C{str}
122
123 """
124 if type(loglevel_name) is types.IntegerType:
125 self.loglevel = loglevel_name
126 elif type(loglevel_name) is types.StringType and loglevel_name in self._loglevel_NAMES.values():
127 _method = getattr(self, 'self.set_loglevel_%s' % loglevel_name)
128 _method()
129 else:
130 self.loglevel = loglevel_DEFAULT
131
133 """\
134 Silence logging completely.
135
136 """
137 self.loglevel = 0
138
140 """\
141 Set log level to I{ERROR}.
142
143 """
144 self.loglevel = loglevel_ERROR
145
152
159
166
173
175 """\
176 Additionally, switch on sFTP data transfer debugging
177
178 """
179 self.loglevel = self.loglevel | loglevel_DEBUG_SFTPXFER
180
182 """\
183 Switch off sFTP data transfer debugging.
184
185 """
186 self.loglevel = self.loglevel ^ loglevel_DEBUG_SFTPXFER
187