logging模块是在2.3新引进的功能,下面是一些常用的类和模块级函数
模块级函数
logging.getLogger([name]):返回一个logger对象,如果没有指定名字将返回root logger
logging.debug()、logging.info()、logging.warning()、logging.error()、logging.critical():设定root logger的日志级别
logging.basicConfig():用默认Formatter为日志系统建立一个StreamHandler,设置基础配置并加到root logger中
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
import loggingimport sysLEVELS
= {'debug':
logging.DEBUG, 'info':
logging.INFO, 'warning':
logging.WARNING, 'error':
logging.ERROR, 'critical':
logging.CRITICAL}if len(sys.argv)
> 1: level_name
= sys.argv[1] level
= LEVELS.get(level_name,
logging.NOTSET) logging.basicConfig(level=level)logging.debug('This
is a debug message')logging.info('This
is an info message')logging.warning('This
is a warning message')logging.error('This
is an error message')logging.critical('This
is a critical error message') |
$ python logging_level_example.py debug
DEBUG:root:This is a debug message
INFO:root:This is an info message
WARNING:root:This is a warning message
ERROR:root:This is an error message
CRITICAL:root:This is a critical error message
$ python logging_level_example.py info
INFO:root:This is an info message
WARNING:root:This is a warning message
ERROR:root:This is an error message
CRITICAL:root:This is a critical error message
Loggers
Logger.setLevel(lel):指定最低的日志级别,低于lel的级别将被忽略。debug是最低的内置级别,critical为最高
Logger.addFilter(filt)、Logger.removeFilter(filt):添加或删除指定的filter
Logger.addHandler(hdlr)、Logger.removeHandler(hdlr):增加或删除指定的handler
Logger.debug()、Logger.info()、Logger.warning()、Logger.error()、Logger.critical():可以设置的日志级别
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
import logging#
create loggerlogger
= logging.getLogger("simple_example")logger.setLevel(logging.DEBUG)#
create console handler and set level to debugch
= logging.StreamHandler()ch.setLevel(logging.DEBUG)#
create formatterformatter
= logging.Formatter("%(asctime)s
- %(name)s - %(levelname)s - %(message)s")#
add formatter to chch.setFormatter(formatter)#
add ch to loggerlogger.addHandler(ch)#
"application" codelogger.debug("debug
message")logger.info("info
message")logger.warn("warn
message")logger.error("error
message")logger.critical("critical
message") |
$ python simple_logging_module.py
2005-03-19 15:10:26,618 - simple_example - DEBUG - debug message
2005-03-19 15:10:26,620 - simple_example - INFO - info message
2005-03-19 15:10:26,695 - simple_example - WARNING - warn message
2005-03-19 15:10:26,697 - simple_example - ERROR - error message
2005-03-19 15:10:26,773 - simple_example - CRITICAL - critical message
Handlers
handler对象负责发送相关的信息到指定目的地。可以通过addHandler()方法添加多个多handler
Handler.setLevel(lel):指定被处理的信息级别,低于lel级别的信息将被忽略
Handler.setFormatter():给这个handler选择一个格式
Handler.addFilter(filt)、Handler.removeFilter(filt):新增或删除一个filter对象
Formatters
Formatter对象设置日志信息最后的规则、结构和内容,默认的时间格式为%Y-%m-%d %H:%M:%S,下面是Formatter常用的一些信息
|
%(name)s |
Logger的名字 |
|
%(levelno)s |
数字形式的日志级别 |
|
%(levelname)s |
文本形式的日志级别 |
|
%(pathname)s |
调用日志输出函数的模块的完整路径名,可能没有 |
|
%(filename)s |
调用日志输出函数的模块的文件名 |
|
%(module)s |
调用日志输出函数的模块名 |
|
%(funcName)s |
调用日志输出函数的函数名 |
|
%(lineno)d |
调用日志输出函数的语句所在的代码行 |
|
%(created)f |
当前时间,用UNIX标准的表示时间的浮 点数表示 |
|
%(relativeCreated)d |
输出日志信息时的,自Logger创建以 来的毫秒数 |
|
%(asctime)s |
字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒 |
|
%(thread)d |
线程ID。可能没有 |
|
%(threadName)s |
线程名。可能没有 |
|
%(process)d |
进程ID。可能没有 |
|
%(message)s |
用户输出的消息 |
最后来个例子
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
import logging#
set up logging to file - see previous section for more detailslogging.basicConfig(level=logging.DEBUG, format='%(asctime)s
%(name)-12s %(levelname)-8s %(message)s', datefmt='%m-%d
%H:%M', filename='/temp/myapp.log', filemode='w')#
define a Handler which writes INFO messages or higher to the sys.stderrconsole
= logging.StreamHandler()console.setLevel(logging.INFO)#
set a format which is simpler for console useformatter
= logging.Formatter('%(name)-12s:
%(levelname)-8s %(message)s')#
tell the handler to use this formatconsole.setFormatter(formatter)#
add the handler to the root loggerlogging.getLogger('').addHandler(console)#
Now, we can log to the root logger, or any other logger. First the root...logging.info('Jackdaws
love my big sphinx of quartz.')#
Now, define a couple of other loggers which might represent areas in your#
application:logger1
= logging.getLogger('myapp.area1')logger2
= logging.getLogger('myapp.area2')logger1.debug('Quick
zephyrs blow, vexing daft Jim.')logger1.info('How
quickly daft jumping zebras vex.')logger2.warning('Jail
zesty vixen who grabbed pay from quack.')logger2.error('The
five boxing wizards jump quickly.') |
运行后,在终端看到的结果
root : INFO Jackdaws love my big sphinx of quartz.
myapp.area1 : INFO How quickly daft jumping zebras vex.
myapp.area2 : WARNING Jail zesty vixen who grabbed pay from quack.
myapp.area2 : ERROR The five boxing wizards jump quickly.
在日志文件中的结果
10-22 22:19 root INFO Jackdaws love my big sphinx of quartz.
10-22 22:19 myapp.area1 DEBUG Quick zephyrs blow, vexing daft Jim.
10-22 22:19 myapp.area1 INFO How quickly daft jumping zebras vex.
10-22 22:19 myapp.area2 WARNING Jail zesty vixen who grabbed pay from quack.
10-22 22:19 myapp.area2 ERROR The five boxing wizards jump quickly.
发现DEBUG信息只有在文件中出现,这是因为StreamHandler中setLevel是INFO,可以看出Logger.setLevel()和handler.setLevel()的区别
详细信息请参阅 http://docs.python.org/library/logging.html
本文详细介绍Python的logging模块,包括常用类、模块级函数、Logger、Handler、Formatter等组件的使用方法,并通过具体示例展示了不同日志级别的配置及输出。
17万+

被折叠的 条评论
为什么被折叠?



