annotate roundup/rlog.py @ 2670:bdf3a73dfd04

merge from maint-0-7
author Richard Jones <richard@users.sourceforge.net>
date Tue, 07 Sep 2004 10:40:15 +0000
parents 6e9bd67fefa9
children 93e2e5b55a3c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2397
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1 '''Roundup basic logging support.
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
2
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
3 This module will use the standard Python logging implementation when
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
4 available. If not, then a basic logging implementation, BasicLogging and
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
5 BasicLoggingChannel will be used.
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
6
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
7 Configuration for "logging" module:
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
8 - tracker configuration file specifies the location of a logging
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
9 configration file as LOGGING_CONFIG
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
10 - roundup-server and roundup-mailgw specify the location of a logging
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
11 configuration file on the command line
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
12 Configuration for "BasicLogging" implementation:
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
13 - tracker configuration file specifies the location of a log file
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
14 LOGGING_FILENAME
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
15 - tracker configuration file specifies the level to log to as
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
16 LOGGING_LEVEL
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
17 - roundup-server and roundup-mailgw specify the location of a log
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
18 file on the command line
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
19 - roundup-server and roundup-mailgw specify the level to log to on
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
20 the command line
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
21
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
22 In both cases, if no logfile is specified then logging will simply be sent
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
23 to sys.stderr with only logging of ERROR messages.
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
24
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
25 In terms of the Roundup code using the logging implementation:
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
26 - a "logging" object will be available on the "config" object for each
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
27 tracker
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
28 - the roundup-server and roundup-mailgw code will have a global "logging"
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
29 object.
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
30
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
31 It is intended that the logger API implementation here be the same as (or
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
32 close enough to) that of the standard Python library "logging" module.
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
33 '''
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
34 import sys, time, traceback
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
35
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
36 class BasicLogging:
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
37 LVL_DEBUG = 4
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
38 LVL_INFO = 3
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
39 LVL_WARNING= 2
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
40 LVL_ERROR= 1
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
41 LVL_NONE = 0
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
42 NAMES = {
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
43 LVL_DEBUG: 'DEBUG',
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
44 LVL_INFO: 'INFO',
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
45 LVL_WARNING: 'WARNING',
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
46 LVL_ERROR: 'ERROR',
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
47 }
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
48 level = LVL_INFO
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
49 loggers = {}
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
50 file = None
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
51 def getLogger(self, name):
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
52 return self.loggers.setdefault(name, BasicLogger(self.file, self.level))
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
53 def fileConfig(self, filename):
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
54 '''User is attempting to use a config file, but the basic logger
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
55 doesn't support that.'''
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
56 raise RuntimeError, "File-based logging configuration requires "\
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
57 "the logging package."
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
58 def setFile(self, file):
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
59 '''Set the file to log to. "file" is either an open file object or
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
60 a string filename to append entries to.
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
61 '''
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
62 if isinstance(file, type('')):
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
63 file = open(file, 'a')
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
64 self.file = file
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
65 def setLevel(self, level):
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
66 '''Set the maximum logging level. "level" is either a level number
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
67 (one of the LVL_ values) or a string level name.
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
68 '''
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
69 if isinstance(level, type('')):
2412
Richard Jones <richard@users.sourceforge.net>
parents: 2397
diff changeset
70 for num, name in self.NAMES.items():
2397
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
71 if name == level:
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
72 level = num
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
73 self.level = level
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
74
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
75 class BasicLogger:
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
76 '''Used when the standard Python library logging module isn't available.
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
77
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
78 Supports basic configuration through the tracker config file vars
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
79 LOGGING_LEVEL and LOGGING_FILENAME.'''
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
80 def __init__(self, file, level):
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
81 self.file = file
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
82 self.level = level
2605
6e9bd67fefa9 complete transition from HYPERDBDEBUG to new logging
Richard Jones <richard@users.sourceforge.net>
parents: 2585
diff changeset
83 self.format = '%(time)s %(level)s %(message)s'
2397
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
84
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
85 def setFile(self, file):
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
86 '''Set the file to log to. "file" is either an open file object or
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
87 a string filename to append entries to.
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
88 '''
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
89 if isinstance(file, type('')):
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
90 file = open(file, 'a')
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
91 self.file = file
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
92 def setLevel(self, level):
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
93 '''Set the maximum logging level. "level" is either a level number
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
94 (one of the LVL_ values) or a string level name.
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
95 '''
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
96 if isinstance(level, type('')):
2412
Richard Jones <richard@users.sourceforge.net>
parents: 2397
diff changeset
97 for num, name in BasicLogging.NAMES.items():
2397
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
98 if name == level:
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
99 level = num
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
100 self.level = level
2605
6e9bd67fefa9 complete transition from HYPERDBDEBUG to new logging
Richard Jones <richard@users.sourceforge.net>
parents: 2585
diff changeset
101 def setFormat(self, format):
6e9bd67fefa9 complete transition from HYPERDBDEBUG to new logging
Richard Jones <richard@users.sourceforge.net>
parents: 2585
diff changeset
102 self.format = format
2397
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
103 def write(self, level, message):
2605
6e9bd67fefa9 complete transition from HYPERDBDEBUG to new logging
Richard Jones <richard@users.sourceforge.net>
parents: 2585
diff changeset
104 info = {
6e9bd67fefa9 complete transition from HYPERDBDEBUG to new logging
Richard Jones <richard@users.sourceforge.net>
parents: 2585
diff changeset
105 'time': time.strftime('%Y-%m-%d %H:%M:%D'),
6e9bd67fefa9 complete transition from HYPERDBDEBUG to new logging
Richard Jones <richard@users.sourceforge.net>
parents: 2585
diff changeset
106 'level': BasicLogging.NAMES[level],
6e9bd67fefa9 complete transition from HYPERDBDEBUG to new logging
Richard Jones <richard@users.sourceforge.net>
parents: 2585
diff changeset
107 'message': message
6e9bd67fefa9 complete transition from HYPERDBDEBUG to new logging
Richard Jones <richard@users.sourceforge.net>
parents: 2585
diff changeset
108 }
6e9bd67fefa9 complete transition from HYPERDBDEBUG to new logging
Richard Jones <richard@users.sourceforge.net>
parents: 2585
diff changeset
109 message = self.format%info
2397
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
110 self._write(message)
2605
6e9bd67fefa9 complete transition from HYPERDBDEBUG to new logging
Richard Jones <richard@users.sourceforge.net>
parents: 2585
diff changeset
111 self._write('\n')
2397
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
112 def _write(self, text):
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
113 file = self.file or sys.stderr
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
114 file.write(text)
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
115 def debug(self, message):
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
116 if self.level < BasicLogging.LVL_DEBUG: return
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
117 self.write(BasicLogging.LVL_DEBUG, message)
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
118 def info(self, message):
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
119 if self.level < BasicLogging.LVL_INFO: return
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
120 self.write(BasicLogging.LVL_INFO, message)
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
121 def warning(self, message):
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
122 if self.level < BasicLogging.LVL_WARNING: return
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
123 self.write(BasicLogging.LVL_WARNING, message)
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
124 def error(self, message):
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
125 if self.level < BasicLogging.LVL_ERROR: return
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
126 self.write(BasicLogging.LVL_ERROR, message)
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
127 def exception(self, message):
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
128 if self.level < BasicLogging.LVL_ERROR: return
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
129 self.write(BasicLogging.LVL_ERROR, message)
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
130 self._write(traceback.format_exception(*(sys.exc_info())))
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
131

Roundup Issue Tracker: http://roundup-tracker.org/