30
30
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31
31
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
32
32
# OF THE POSSIBILITY OF SUCH DAMAGE.
33
- import warnings
34
- import logging
35
-
36
33
__author__ = 'Cosmin Basca'
37
34
38
- # TODO: create a global surf logger
39
-
40
- __levels__ = {
41
- 'debug' :logging .DEBUG ,
42
- 'info' :logging .INFO ,
43
- 'warning' :logging .WARNING ,
44
- 'error' :logging .ERROR ,
45
- 'critical' :logging .CRITICAL ,
46
- }
47
-
48
- surf_logger = logging .getLogger ('surf' )
49
- surf_logger .addHandler (logging .StreamHandler ())
50
- surf_logger .setLevel (logging .INFO )
51
-
52
- # enable deprecation warnings to show up
53
- #TODO: turn off when no more deprecated functions are in use!
54
- warnings .simplefilter ('always' )
55
-
56
- def set_loglevel (level = 'info' ):
57
- global surf_logger
58
- if isinstance (level , basestring ):
59
- surf_logger .setLevel (__levels__ .get (level , 'info' ))
60
- else :
61
- surf_logger .setLevel (level )
62
-
63
- def enable_root_logger ():
64
- logging .root .disabled = False
65
-
66
- def disable_root_logger ():
67
- logging .root .disabled = True
68
-
69
- def deprecation (message ):
70
- warnings .warn (message , DeprecationWarning , stacklevel = 2 )
71
-
72
- def deprecated (func ):
73
- """This is a decorator which can be used to mark functions
74
- as deprecated. It will result in a warning being emmitted
75
- when the function is used.
76
-
77
- the function is included *as is* from:
78
- http://code.activestate.com/recipes/391367/"""
79
- def newFunc (* args , ** kwargs ):
80
- warnings .warn ("Call to deprecated function %s." % func .__name__ ,
81
- category = DeprecationWarning )
82
- return func (* args , ** kwargs )
83
- newFunc .__name__ = func .__name__
84
- newFunc .__doc__ = func .__doc__
85
- newFunc .__dict__ .update (func .__dict__ )
86
- return newFunc
35
+ LOGGER_NAME = 'surf'
36
+
37
+ _logger = None
38
+
39
+ DISABLED = 100
40
+ CRITICAL = 50
41
+ ERROR = 40
42
+ WARNING = 30
43
+ INFO = 20
44
+ DEBUG = 10
45
+ NOTSET = 0
46
+
47
+
48
+ def debug (msg , * args ):
49
+ if __debug__ :
50
+ if _logger :
51
+ _logger .log (DEBUG , msg , * args )
52
+
53
+
54
+ def info (msg , * args ):
55
+ if _logger :
56
+ _logger .log (INFO , msg , * args )
57
+
58
+
59
+ def warn (msg , * args ):
60
+ if _logger :
61
+ _logger .log (WARNING , msg , * args )
62
+
63
+
64
+ def error (msg , * args ):
65
+ if _logger :
66
+ _logger .log (ERROR , msg , * args )
67
+
68
+
69
+ def get_logger (name = LOGGER_NAME , handler = None ):
70
+ import logging
71
+
72
+ LOG_FORMAT = '%(asctime)s %(levelname)-8s %(name)-15s %(message)s'
73
+ logging ._acquireLock ()
74
+ try :
75
+ # general setup
76
+ formatter = logging .Formatter (LOG_FORMAT )
77
+
78
+ if not handler :
79
+ handler = [logging .StreamHandler ()]
80
+ elif not isinstance (handler , (list , tuple )):
81
+ handler = [handler ]
82
+
83
+ logger = logging .getLogger (name )
84
+ logger .propagate = 0
85
+ for hndlr in handler :
86
+ hndlr .setFormatter (formatter )
87
+ logger .addHandler (hndlr )
88
+ finally :
89
+ logging ._releaseLock ()
90
+
91
+ return logger
92
+
93
+
94
+ def setup_logger (name = LOGGER_NAME , handler = None ):
95
+ global _logger
96
+ _logger = get_logger (name = name , handler = handler )
97
+
98
+
99
+ def uninstall_logger ():
100
+ global _logger
101
+ _logger = None
102
+
103
+
104
+ def set_logger (logger ):
105
+ global _logger
106
+ if logger :
107
+ _logger = logger
108
+
109
+
110
+ def set_logger_level (level , name = None ):
111
+ import logging
112
+
113
+ logging ._acquireLock ()
114
+ try :
115
+ logger = logging .getLogger (name ) if name else logging .root
116
+ if isinstance (level , basestring ):
117
+ level = level .upper ()
118
+ logger .setLevel (level )
119
+ finally :
120
+ logging ._releaseLock ()
121
+
122
+
123
+ def disable_logger (name = None ):
124
+ set_logger_level (DISABLED , name = name )
0 commit comments