3
3
标准的输出日志库,比每次用 print 输出不知道高到哪里去了。
4
4
5
5
``` python
6
-
6
+ # coding=utf-8
7
7
8
8
import logging
9
9
import sys
@@ -24,18 +24,19 @@ logging.info('This is an info message')
24
24
logging.warning(' This is a warning message' )
25
25
logging.error(' This is an error message' )
26
26
logging.critical(' This is a critical error message' )
27
+
27
28
```
28
29
29
30
logging 共分五个 log 等级,默认输出的 Level 为 warning 等级,可以设定为其他等级就可以将代码中的每一个等级大于等于 Level 的问题都输出。
30
31
31
32
``` python
32
-
33
+ # coding=utf-8
33
34
34
35
import sys
35
36
import logging
36
-
37
+
37
38
logger = logging.getLogger(" Test Logging" )
38
- formatter = logging.Formatter(' %(name)-12s %(asctime)s %(levelname)-8s %(lineno)-4d %(message)s ' , ' %Y%b%d %a %H:%M:%S' , )
39
+ formatter = logging.Formatter(' %(name)-12s %(asctime)s %(levelname)-8s %(lineno)-4d %(message)s ' , ' %Y%b%d %a %H:%M:%S' )
39
40
file_handler = logging.FileHandler(" test.log" )
40
41
file_handler.setFormatter(formatter)
41
42
file_handler.setLevel(logging.DEBUG )
@@ -46,7 +47,7 @@ stream_handler.setLevel(logging.WARNING)
46
47
47
48
logger.addHandler(file_handler)
48
49
logger.addHandler(stream_handler)
49
- # logger.setLevel(logging.INFO )
50
+ logger.setLevel(logging.DEBUG )
50
51
51
52
logger.debug(' This is a debug message' )
52
53
logger.info(' This is an info message' )
@@ -105,6 +106,7 @@ logger.setLevel(logging.DEBUG)
105
106
也可以这样配置日志
106
107
107
108
```
109
+ # coding=utf-8
108
110
import logging
109
111
110
112
def main():
@@ -131,3 +133,57 @@ def main():
131
133
if __name__ == '__main__':
132
134
main()
133
135
```
136
+
137
+ 关于 logger 输出异常堆栈,无论使用 ` logger.info ` 或者 ` logger.error ` 输出格式都是一样的,只是日志等级不一样,但是有时在输出异常的时候,我们不只是需要知道异常名称,还需要知道异常的上下文,堆栈信息等,特别是在多线程中,子线程的异常不会被主线程捕获输出,只能通过日志打印出来。
138
+
139
+ 所以可以使用 ` logger.exception ` 代替 ` logger.error ` ,日志等级也是 ` error ` , 但是会打印出异常的堆栈信息。
140
+
141
+
142
+ 示例代码
143
+
144
+ ```
145
+ # coding=utf-8
146
+
147
+ import sys
148
+ import logging
149
+
150
+ logger = logging.getLogger(__name__)
151
+ formatter = logging.Formatter('%(name)-12s %(asctime)s %(levelname)-8s %(lineno)-4d %(message)s', '%Y %b %d %a %H:%M:%S',)
152
+
153
+ stream_handler = logging.StreamHandler(sys.stderr)
154
+ stream_handler.setFormatter(formatter)
155
+
156
+ logger.addHandler(stream_handler)
157
+ logger.setLevel(logging.DEBUG)
158
+
159
+ if __name__ == '__main__':
160
+ logger.info("main start...")
161
+ try:
162
+ 1 / 0
163
+ except Exception as e:
164
+ logger.exception("error %s", e)
165
+ logger.info("main end.")
166
+
167
+ ```
168
+
169
+ 对比一下输出的日志即可看出。
170
+
171
+ 使用 ` logger.error ` 的效果
172
+
173
+ ```
174
+ __main__ 2019 May 25 Sat 22:23:36 INFO 16 main start...
175
+ __main__ 2019 May 25 Sat 22:23:36 ERROR 20 error integer division or modulo by zero
176
+ __main__ 2019 May 25 Sat 22:23:36 INFO 21 main end.
177
+ ```
178
+
179
+ 使用 ` logger.exception ` 的效果
180
+
181
+ ```
182
+ __main__ 2019 May 25 Sat 22:23:52 INFO 16 main start...
183
+ __main__ 2019 May 25 Sat 22:23:52 ERROR 20 error integer division or modulo by zero
184
+ Traceback (most recent call last):
185
+ File "code/logging_exception.py", line 18, in <module>
186
+ 1 / 0
187
+ ZeroDivisionError: integer division or modulo by zero
188
+ __main__ 2019 May 25 Sat 22:23:52 INFO 21 main end.
189
+ ```
0 commit comments