logging模块的作用主要用于日志的记录。
logging模块提供了标准的日志接口,可以通过它存储各种格式的日志。 logging的日志可以分为debug() (调试模式,日志很详细方便调试)、info()(普通日志)、warning()(没有发生错误,但是有可能发生问题的日志)、error()(出问题的日志)和critical()(严重问题的日志)5个级别。
使用方法:
最简单的方法:
输入
1 import logging
2 logging.warning("user [Kevin] attempted wrong password more than 3 times")
3 logging.critical("server is down")
输出
1 WARNING:root:user [Kevin] attempted wrong password more than 3 times
2 CRITICAL:root:server is down
root:没有指定用户,默认root执行
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. |
把日志写到文件
1 import logging
2 logging.basicConfig(filename='example.log', level=logging.INFO)
3 logging.debug('This message should go to the log file')
4 logging.info('so should this')
5 logging.warning('And this,too')
example.log文件执行后的内容
1 INFO:root:so should this
2 WARNING:root:And this,too
logging.basicConfig中的level=logging.INFO表示只执行info和比他等级高的日志,所以debug的日志没有执行写入。如果想debug也执行只需要把INFO改成DEBUG就可以了。
自定义日志格式
1 import logging
2 logging.basicConfig(filename='example.log', level=logging.INFO, format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p')
3 logging.debug("This message should go to the log file")
4 logging.info("so should this")
5 logging.warning("And this,too")
除了时间可以自定义外,还有很多可以自定义的格式
%(name)s | Logger的名字 |
%(levelno)s | 数字形式的日志级别 |
%(levelname)s | 文本形式的日志级别 |
%(pathname)s | 调用日志输出函数的模块的完整路径,可能没有 |
%(filename)s | 调用日志输出函数的模块的文件名 |
%(module)s | 调用日志输出函数的模块名 |
%(lfuncName)s | 调用日志输出函数的函数名 |
%(lineno)d | 调用日志输出函数的语句所在的代码行 |
%(created)s | 当前时间,用UNIX标准的表示时间的浮点数表示 |
%(relativeCreated)d | 输出日志信息时的,自Logger创建以来的毫秒数 |
%(asctime)s | 字符串形式的当前时间。默认格式时“2019-06-05 22:59:45,896”。逗号后面的是毫秒 |
%(thread)d | 线程ID。可能没有 |
%(threadName)d | 线程名。可能没有 |
%(process)s | 进程ID。可能没有 |
%(message)s | 用户输出的消息 |
日志同时输出到屏幕和文件
python中Logging模块记录日志涉及四个主要类,
1、logger提供了应用程序可以直接使用的接口;
2、handler将(logger创建的)日志记录发送到合适的目的输出;
3、filter提供了细度设备来决定输出那条日志记录;
4、formatter决定了日志记录的最终输出格式。
每个组件的主要功能
每个程序在输出信息之前都要有一个Logger。Logger通常对应了程序的模块名,比如聊天工具的图形界面模块可以这样获取它的Logger:
1 logger = logging.getLogger("chat.gui")
而核心模块可以这样写
1 1 logger = logging.getLogger("chat.kernel")
还可以绑定handler和filters
1 logger.setLevel(level) # 设置一个最低的日志级别,低于level的级别将被忽略,debug是最低的内置级别,critical为最高。 2 logger.addFilter(filter) logger.removeFilter(filter) # 添加或删除指定的filter 3 logger.addHandler(hdlr) logger.removeHandler(hdlr) # 增加或删除指定的Handler
handler
handler对象负责发送相关的信息到指定目的地python有多种handler可以使用。有些handler可以把信息输到控制台,有些handler可以把信息输到文件,还有些handler可以把信息发送到网络上,如果觉得不够用还可以编写自己的handler。可以通过addHandler()方法添加多个handler。
1 Handler.setLevel(level) # 指定被处理的信息级别,低于level的将被忽略
2 Handler.setFormatter() # 给这个handler选择一个格式
3 Handler.addFilter(filter) Handler.removeFilter(filter) # 新增或删除一个filter对象
每个Logger可以附加多个Handler。接下来我介绍一些常用的Handler:
1、logging.StreamHandler使用这个Handler可以向类似与sys.stdout或sys.stderr的任何文件对象(file object)输出信息。
2、logging.FileHandler和StreamHandler类似,用于向一个文件输出日志信息。不过FileHandler会帮你打开这个文件。
3、logging.handlers.RotatingFileHandler
这个Handler类似于上面的FileHandler,但是它可以管理文件大小。当文件达到一定大小之后,他会自动将当前日志文件改名,然后创建一个新的同名日志文件继续输出。比如日志文件是chat.log。当chat.log达到指定大小以后RotatingFileHandler会自动把文件改名为chat.log.1。如果chat.log.1存在,会先把chat.log.1重命名为chat.log.2.。。。最后重新创建chat.log继续输出日志信息。
4、logging.handlers.TimeRotatingFileHandler
这个和RotatingFileHandler类似,不过他没有通过判断文件大小来决定何时重新创建日志文件,而是间隔一定的时间就自动创建新的日志文件,重命名的过程和RotatingFileHandler类似,不过新的文件不是附加数字,而是当前时间。
formatter组件
日志的formatter是个独立的组件可以和handler组合
1 f = logging.FileHandler("access.log")
2 formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
3 f.setFormatter(formatter)
filter组件
如果你想对日志进行一个过滤,就可以自定一个filter