Level | When it’s used |
---|---|
DEBUG | Detailed information, typically of interest only when diagnosing problems. |
INFO | Confirmation that things are working as expected. |
WARNING | An indication that something unexpected happened, or indicative of some problem in the near future (e.g. ‘disk space low’). The software is still working as expected. |
ERROR | Due to a more serious problem, the software has not been able to perform some function. |
CRITICAL | A serious error, indicating that the program itself may be unable to continue running. |
定义了5个等级,这些都是自己来判断的,默认是warning
日志输出等级
import logging
logging.warning('Watch out!') # will print a message to the console
logging.info('I told you so') # will not print anything
输出结果是
WARNING:root:Watch out!
因为默认的level是warning
,所以info
的日志并没有被输出,以此我们可以来控制哪些要输出,哪些不要输出.
例如:
我们设置level为ERROR
,则在程序遇到WARNING
时,日志是不会起作用的,而在遇到ERROR
时,日志则会输出logging.error()
所输入参数的内容
将日志输出为文件
通过basicConfig
来控制输出文件名,和level
import logging
logging.basicConfig(filename='example.log',filemode='w',level=logging.INFO) # 注意INFO必须大写,filemode是选择追加还是覆盖文件
logging.debug('This message should go to the log file')
logging.info('So should this')
logging.warning('And this, too')
打开example.log
文件可以看到输出的结果,由于level
是INFO
所以DEBUG
级别灭有输出:
INFO:root:So should this
WARNING:root:And this, too
多模块日志
只要在一处设置basicConfig即可,logging是全局的
主模块
# myapp.py
import logging
import mylib
def main():
logging.basicConfig(filename='myapp.log', level=logging.INFO)
logging.info('Started')
mylib.do_something()
logging.info('Finished')
if __name__ == '__main__':
main()
子模块
# mylib.py
import logging
def do_something():
logging.info('Doing something')
输出结果myapp.log
,主模块和子模块都输出到同一个文件中:
INFO:root:Started
INFO:root:Doing something
INFO:root:Finished
日志变量
日志变量使用%-style
风格
import logging
logging.warning('%s before you %s', 'Look', 'leap!') # 第一个%s指代look,第二个%s指代leap
改变日志的输出格式
import logging
logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.DEBUG)
logging.debug('This message should appear on the console')
logging.info('So should this')
logging.warning('And this, too')
输出结果是,按照’%(levelname)s:%(message)s’的格式,%与s中间的括号levelname
是logging
模块内置的变量,可以在LogRecord attributes查询,
其中message
就是debug
,info
输入的参数
DEBUG:This message should appear on the console
INFO:So should this
WARNING:And this, too
进阶教程
模块 | 名称 |
---|---|
Loggers | |
Handlers | 控制日志的输出 |
Filters | 过滤输出的内容 |
Formatters | 输出的格式 |
可以给logger
类取名字,可以通过这样查看是日志出于哪个模块.
所有的logger都继承于名字为root
的logger
logger = logging.getLogger(__name__)
可以通过handler
将日志输出到不同的地方,比如文件,HTTP,email,sockeets,queues等.
默认情况下,日志讲输出到os.stderr
,可以使用basicConfig
控制输出到文件
logger
logger对象有两类方法,一类是配置方法,一类是消息方法
配置方法 | 描述 |
---|---|
Logger.setLevel() | |
Logger.addHandler() | |
Logger.removeHandler() | |
Logger.addFilter() | |
Logger.removeFilter() |
消息方法 | 描述 |
---|---|
Logger.debug() | |
Logger.info() | |
Logger.warning() | |
Logger.error() | |
Logger.critical() | |
Logger.exception() | 比Logger.error更详细 |
Logger.log() | 参数指定level ,太冗长,推荐上面的便利方法 |
getLogger() | 获得指定名称的logger对象,foo.bar ,foo.bam 都继承于foo ,而所有的都继承于root .等级继承于父类 |
handler
可以通过handler
将不同的日志信息输出到不同的地方,比如讲所有的日志信息放在一个文件里,讲error信息输出到标准输出,讲critical信息发送邮件
handler | 描述 |
---|---|
StreamHandler | 将消息发送到流 |
FileHandler | 将消息发送到文件 |
BaseRotatingHandler | |
RotatingFileHandler | |
TimedRotatingFileHandler | |
SocketHandler | 发送到socket,tcp |
DatagramHandler | udp |
SMTPHandler | 发送邮件 |
SysLogHandler | |
NTEventLogHandler | |
MemoryHandler | |
HTTPHandler | 发送到http,get/post |
WatchedFileHandler | |
QueueHandler | |
NullHandler |
formatters
configuring logging
参考:
https://docs.python.org/3/howto/logging.html#logging-basic-tutorial
https://www.cnblogs.com/louis-w/p/8567434.html
https://www.cnblogs.com/jackadam/p/9228116.html