3 Module for logging errors
5 __copyright__
= "Copyright (c) 2002-2005 Free Software Foundation, Inc."
6 __license__
= """ GNU General Public License
8 This program is free software; you can redistribute it and/or modify it under the
9 terms of the GNU General Public License as published by the Free Software
10 Foundation; either version 2 of the License, or (at your option) any later
13 This program is distributed in the hope that it will be useful, but WITHOUT
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
15 FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License along with
18 this program; if not, write to the Free Software Foundation, Inc., 59 Temple
19 Place - Suite 330, Boston, MA 02111-1307, USA. """
21 from StringIO
import StringIO
30 logging
.basicConfig(level
=logging
.DEBUG
,
31 format
='%(asctime)s %(levelname)-8s %(message)s',
35 console
= logging
.StreamHandler()
36 console
.setLevel(logging
.DEBUG
)
37 formatter
= logging
.Formatter('%(asctime)s %(levelname)-8s %(message)s')
38 console
.setFormatter(formatter
)
39 logging
.getLogger('').addHandler(console
)
42 # TODO: introduce hierarchical loggers
43 return logging
.getLogger("")
45 def debug(msg
, *args
, **kwargs
):
49 caller
= traceback
.extract_stack()[-2]
52 def _log(caller
= None, *args
):
54 caller
= traceback
.extract_stack()[-2]
56 cf
= caller
[0][caller
[0].rindex("/")+1:]
59 stream
.write("%s:%d:%s: " % (cf
, caller
[1], caller
[2]))
61 if type(a
) is not type(''):
67 _log(traceback
.extract_stack()[-2], *args
)
68 l
= traceback
.format_list(traceback
.extract_stack()[:-1])
72 def logparam(locals, *vars):
75 logargs
.append(v
+ ": " + str(locals[v
]))
76 _log(traceback
.extract_stack()[-2], ", ".join(logargs
))
78 def logpparam(locals, *vars):
82 pprint
.pprint(locals[v
], sio
)
83 logargs
.append(v
+ ": " + sio
.getvalue())
85 _log(traceback
.extract_stack()[-2], "".join(logargs
))
95 def get_indent(): return " " * depth
98 caller
= traceback
.extract_stack()[-2]
100 def f2(*args
, **kwargs
):
102 if isinstance(o
, str):
105 indent
= get_indent()
106 _log(caller
, "%sEntering " % indent
, f
.__name
__)
107 argstr
= ", ".join([maybe_str(a
) for a
in args
])
109 argstr
+= ", " + ", ".join(
110 ["%s: %s" % (maybe_str(k
), maybe_str(v
))
111 for k
, v
in kwargs
.items()])
112 _log(caller
, "%sArgs: (" % indent
, argstr
, ")")
116 r
= f(*args
, **kwargs
)
119 _log(caller
, "%sReturning %s from %s" % (
120 indent
, str(r
), f
.__name
__))
126 # Originally by Bryn Keller
127 # http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/52215
128 def log_exc(message
):
130 Print the usual traceback information, followed by a listing of all the
131 local variables in each frame.
133 _log(traceback
.extract_stack()[-2], message
)
134 tb
= sys
.exc_info()[2]
145 traceback
.print_exc()
146 print >>stream
, "Locals by frame, innermost last"
149 print >>stream
, "Frame %s in %s at line %s" % (
150 frame
.f_code
.co_name
, frame
.f_code
.co_filename
,
152 for key
, value
in frame
.f_locals
.items():
153 print >>stream
, "\t%20s = " % key
,
154 #We have to be careful not to cause a new error in our error
155 #printer! Calling str() on an unknown object could cause an
156 #error we don't want.
158 print >>stream
, value
160 print >>stream
, "<ERROR WHILE PRINTING VALUE>"