2
2
#
3
3
# SPDX-License-Identifier: MIT
4
4
5
+ # noinspection PyUnresolvedReferences
5
6
"""
6
7
`adafruit_logging`
7
8
================================================================================
22
23
* Adafruit CircuitPython firmware for the supported boards:
23
24
https://github.com/adafruit/circuitpython/releases
24
25
26
+ Attributes
27
+ ----------
28
+ LEVELS : list
29
+ A list of tuples representing the valid logging levels used by
30
+ this module. Each tuple contains exactly two elements: one int and one
31
+ str. The int in each tuple represents the relative severity of that
32
+ level (00 to 50). The str in each tuple is the string representation of
33
+ that logging level ("NOTSET" to "CRITICAL"; see below).
34
+ NOTSET : int
35
+ The NOTSET logging level, which is a dummy logging level that can be
36
+ used to indicate that a `Logger` should not print any logging messages,
37
+ regardless of how severe those messages might be (including CRITICAL).
38
+ DEBUG : int
39
+ The DEBUG logging level, which is the lowest (least severe) real level.
40
+ INFO : int
41
+ The INFO logging level for informative/informational messages.
42
+ WARNING : int
43
+ The WARNING logging level for warnings that should be addressed/fixed.
44
+ ERROR : int
45
+ The ERROR logging level for Python exceptions that occur during runtime.
46
+ CRITICAL : int
47
+ The CRITICAL logging level, which is the highest (most severe) level for
48
+ unrecoverable errors that have caused the code to halt and exit.
49
+
25
50
"""
26
51
# pylint:disable=redefined-outer-name,consider-using-enumerate,no-self-use
27
52
# pylint:disable=invalid-name
30
55
31
56
__version__ = "0.0.0-auto.0"
32
57
__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Logger.git"
58
+ # noinspection PyUnresolvedReferences
59
+ # pylint:disable=undefined-all-variable
60
+ __all__ = ['LEVELS' , 'NOTSET' , 'DEBUG' , 'INFO' , 'WARNING' , 'ERROR' , 'CRITICAL' ,
61
+ 'level_for' , 'LoggingHandler' , 'PrintHandler' , 'logger_cache' ,
62
+ 'null_logger' , 'getLogger' , 'Logger' , 'NullLogger' ]
33
63
34
64
35
65
LEVELS = [
41
71
(50 , "CRITICAL" ),
42
72
]
43
73
44
- for value , name in LEVELS :
45
- globals ()[name ] = value
74
+ for __value , __name in LEVELS :
75
+ globals ()[__name ] = __value
46
76
47
77
48
- def level_for (value ):
49
- """Convert a numberic level to the most appropriate name.
78
+ def level_for (level_value ):
79
+ """Convert a numeric level to the most appropriate name.
50
80
51
- :param value : a numeric level
81
+ :param int level_value : a numeric level
52
82
53
83
"""
54
84
for i in range (len (LEVELS )):
55
- if value == LEVELS [i ][0 ]:
85
+ if level_value == LEVELS [i ][0 ]:
56
86
return LEVELS [i ][1 ]
57
- if value < LEVELS [i ][0 ]:
87
+ if level_value < LEVELS [i ][0 ]:
58
88
return LEVELS [i - 1 ][1 ]
59
89
return LEVELS [0 ][1 ]
60
90
61
91
62
92
class LoggingHandler :
63
93
"""Abstract logging message handler."""
64
94
65
- def format (self , level , msg ):
95
+ def format (self , log_level , message ):
66
96
"""Generate a timestamped message.
67
97
68
- :param level : the logging level
69
- :param msg : the message to log
98
+ :param int log_level : the logging level
99
+ :param str message : the message to log
70
100
71
101
"""
72
- return "{0}: {1} - {2}" .format (time .monotonic (), level_for (level ), msg )
102
+ return "{0}: {1} - {2}" .format (time .monotonic (),
103
+ level_for (log_level ),
104
+ message )
73
105
74
- def emit (self , level , msg ):
106
+ def emit (self , log_level , message ):
75
107
"""Send a message where it should go.
76
- Place holder for subclass implementations.
108
+ Placeholder for subclass implementations.
77
109
"""
78
110
raise NotImplementedError ()
79
111
80
112
81
113
class PrintHandler (LoggingHandler ):
82
114
"""Send logging messages to the console by using print."""
83
115
84
- def emit (self , level , msg ):
116
+ def emit (self , log_level , message ):
85
117
"""Send a message to teh console.
86
118
87
- :param level : the logging level
88
- :param msg : the message to log
119
+ :param int log_level : the logging level
120
+ :param str message : the message to log
89
121
90
122
"""
91
- print (self .format (level , msg ))
123
+ print (self .format (log_level , message ))
92
124
93
125
94
126
# The level module-global variables get created when loaded
@@ -97,23 +129,24 @@ def emit(self, level, msg):
97
129
logger_cache = dict ()
98
130
null_logger = None
99
131
132
+
100
133
# pylint:disable=global-statement
101
- def getLogger (name ):
134
+ def getLogger (logger_name ):
102
135
"""Create or retrieve a logger by name.
103
136
104
- :param name: the name of the logger to create/retrieve None will cause the
105
- NullLogger instance to be returned.
137
+ :param str logger_name: The name of the `Logger` to create/retrieve. ` None`
138
+ will cause the ` NullLogger` instance to be returned.
106
139
107
140
"""
108
141
global null_logger
109
- if not name or name == "" :
142
+ if not logger_name or logger_name == "" :
110
143
if not null_logger :
111
144
null_logger = NullLogger ()
112
145
return null_logger
113
146
114
- if name not in logger_cache :
115
- logger_cache [name ] = Logger ()
116
- return logger_cache [name ]
147
+ if logger_name not in logger_cache :
148
+ logger_cache [logger_name ] = Logger ()
149
+ return logger_cache [logger_name ]
117
150
118
151
119
152
# pylint:enable=global-statement
@@ -124,16 +157,17 @@ class Logger:
124
157
125
158
def __init__ (self ):
126
159
"""Create an instance."""
160
+ # noinspection PyUnresolvedReferences
127
161
self ._level = NOTSET
128
162
self ._handler = PrintHandler ()
129
163
130
- def setLevel (self , value ):
131
- """Set the logging cuttoff level.
164
+ def setLevel (self , log_level ):
165
+ """Set the logging cutoff level.
132
166
133
- :param value : the lowest level to output
167
+ :param int log_level : the lowest level to output
134
168
135
169
"""
136
- self ._level = value
170
+ self ._level = log_level
137
171
138
172
def getEffectiveLevel (self ):
139
173
"""Get the effective level for this logger.
@@ -143,91 +177,104 @@ def getEffectiveLevel(self):
143
177
"""
144
178
return self ._level
145
179
146
- def addHandler (self , hldr ):
180
+ def addHandler (self , handler ):
147
181
"""Sets the handler of this logger to the specified handler.
148
182
*NOTE* this is slightly different from the CPython equivalent which adds
149
- the handler rather than replaceing it.
183
+ the handler rather than replacing it.
150
184
151
- :param hldr : the handler
185
+ :param handler : the handler
152
186
153
187
"""
154
- self ._handler = hldr
188
+ self ._handler = handler
155
189
156
- def log (self , level , format_string , * args ):
190
+ def log (self , log_level , format_string , * args ):
157
191
"""Log a message.
158
192
159
- :param level: the priority level at which to log
160
- :param format_string: the core message string with embedded formatting directives
161
- :param args: arguments to ``format_string.format()``, can be empty
193
+ :param int log_level: the priority level at which to log
194
+ :param str format_string: the core message string with embedded
195
+ formatting directives
196
+ :param args: arguments to ``format_string.format()``; can be empty
162
197
163
198
"""
164
- if level >= self ._level :
165
- self ._handler .emit (level , format_string % args )
199
+ if log_level >= self ._level :
200
+ self ._handler .emit (log_level , format_string % args )
166
201
167
202
def debug (self , format_string , * args ):
168
203
"""Log a debug message.
169
204
170
- :param format_string: the core message string with embedded formatting directives
171
- :param args: arguments to ``format_string.format()``, can be empty
205
+ :param str format_string: the core message string with embedded
206
+ formatting directives
207
+ :param args: arguments to ``format_string.format()``; can be empty
172
208
173
209
"""
210
+ # noinspection PyUnresolvedReferences
174
211
self .log (DEBUG , format_string , * args )
175
212
176
213
def info (self , format_string , * args ):
177
214
"""Log a info message.
178
215
179
- :param format_string: the core message string with embedded formatting directives
180
- :param args: arguments to ``format_string.format()``, can be empty
216
+ :param str format_string: the core message string with embedded
217
+ formatting directives
218
+ :param args: arguments to ``format_string.format()``; can be empty
181
219
182
220
"""
221
+ # noinspection PyUnresolvedReferences
183
222
self .log (INFO , format_string , * args )
184
223
185
224
def warning (self , format_string , * args ):
186
225
"""Log a warning message.
187
226
188
- :param format_string: the core message string with embedded formatting directives
189
- :param args: arguments to ``format_string.format()``, can be empty
227
+ :param str format_string: the core message string with embedded
228
+ formatting directives
229
+ :param args: arguments to ``format_string.format()``; can be empty
190
230
191
231
"""
232
+ # noinspection PyUnresolvedReferences
192
233
self .log (WARNING , format_string , * args )
193
234
194
235
def error (self , format_string , * args ):
195
236
"""Log a error message.
196
237
197
- :param format_string: the core message string with embedded formatting directives
198
- :param args: arguments to ``format_string.format()``, can be empty
238
+ :param str format_string: the core message string with embedded
239
+ formatting directives
240
+ :param args: arguments to ``format_string.format()``; can be empty
199
241
200
242
"""
243
+ # noinspection PyUnresolvedReferences
201
244
self .log (ERROR , format_string , * args )
202
245
203
246
def critical (self , format_string , * args ):
204
247
"""Log a critical message.
205
248
206
- :param format_string: the core message string with embedded formatting directives
207
- :param args: arguments to ``format_string.format()``, can be empty
249
+ :param str format_string: the core message string with embedded
250
+ formatting directives
251
+ :param args: arguments to ``format_string.format()``; can be empty
208
252
209
253
"""
254
+ # noinspection PyUnresolvedReferences
210
255
self .log (CRITICAL , format_string , * args )
211
256
212
257
213
258
class NullLogger :
214
259
"""Provide an empty logger.
215
- This can be used in place of a real logger to more efficiently disable logging."""
260
+ This can be used in place of a real logger to more efficiently disable
261
+ logging."""
216
262
217
263
def __init__ (self ):
218
264
"""Dummy implementation."""
219
265
220
- def setLevel (self , value ):
266
+ def setLevel (self , log_level ):
221
267
"""Dummy implementation."""
222
268
223
269
def getEffectiveLevel (self ):
224
270
"""Dummy implementation."""
271
+ # noinspection PyUnresolvedReferences
225
272
return NOTSET
226
273
227
- def addHandler (self , hldr ):
274
+ def addHandler (self , handler ):
228
275
"""Dummy implementation."""
229
276
230
- def log (self , level , format_string , * args ):
277
+ def log (self , log_level , format_string , * args ):
231
278
"""Dummy implementation."""
232
279
233
280
def debug (self , format_string , * args ):
0 commit comments