Python模块之 - logging
日志是非常重要的,最近有接触到这个,所以系统的看一下Python这个模块的用法。本文即为Logging模块的用法简介,主要参考文章为Python官方文档,链接见参考列表。
Logging模块构成
组成
主要分为四个部分:
- Loggers:提供应用程序直接使用的接口
- Handlers:将Loggers产生的日志传到指定位置
- Filters:对输出日志进行过滤
- Formatters:控制输出格式
日志级别
Level | Numeric value | When it’s used |
---|---|---|
DEBUG | 10 | Detailed information, typically of interest only when diagnosing problems. |
INFO | 20 | Confirmation that things are working as expected. |
WARNING | 30 | 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 | 40 | Due to a more serious problem, the software has not been able to perform some function. |
CRITICAL | 50 | A serious error, indicating that the program itself may be unable to continue running. |
NOSET | 0 | getattr(logging, loglevel.upper()) |
默认级别是WARNING,可以使用打印到屏幕上的方式记录,也可以记录到文件中。
使用示例
下面的代码展示了logging最基本的用法。
1 # import logging 2 # 3 # logging.basicConfig(filename="log.txt", 4 # level=logging.DEBUG, 5 # format="%(asctime)s %(message)s", 6 # datefmt="%Y-%m") 7 # logging.debug("SS") 8 9 """ 10 %(name)s Logger的名字 11 %(levelno)s 数字形式的日志级别 12 %(levename)s 文本形式的日志级别 13 %(pathname)s 调用日志输出函数的模块的完整路径名,可能没有 14 %(filename)s 调用日志输出函数的模块的文件名 15 %(module)s 调用日志输出函数的模块名 16 %(funcName)s 调用日志输出函数的函数名 17 %(lineno)d 调用日志输出函数的语句所在的代码行 18 %(created)f 当前时间,用UNIX标准的表示时间的浮点数表示 19 %(relativeCreated)d 输出日志信息时的,自Logger创建以来的毫秒数 20 %(asctime)s 字符串形式的当前时间,默认格式是"2003-07-08 16:49:45,896",毫秒 21 %(thread)d 线程ID,可能没有 22 %(threadName)s 线程名,可能没有 23 %(process)d 进程ID,可能没有 24 %(message)s 用户输出的消息 25 26 """ 27 28 # 同时输出到文件,屏幕 29 import logging 30 31 32 class IgnoreBackupLogFilter(logging.Filter): 33 """过滤带db backup 的日志""" 34 35 def filter(self, record): # 固定写法 36 # true 不记录 37 return "db backup" not in record.getMessage() 38 39 40 # 1、生成logger对象 41 logger = logging.getLogger("web") 42 logger.setLevel(logging.DEBUG) # 默认是warning 43 # 1、1 把filter对象添加到logger中 44 logger.addFilter(IgnoreBackupLogFilter()) 45 46 # 2、生成handler对象 47 ch = logging.StreamHandler() 48 ch.setLevel(logging.INFO) 49 # fh = logging.FileHandler("web.log") # 写到那个文件下 50 from logging import handlers 51 fh = handlers.TimedRotatingFileHandler("web.log",when="S",interval=5,backupCount=3) 52 fh.setLevel(logging.WARNING) 53 # 2.1 把handler对象 绑定到logger 54 logger.addHandler(ch) 55 logger.addHandler(fh) 56 57 # 3、生成formatter对象 58 console_formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(filename)s - %(message)s ") 59 file_formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(lineno)d - %(filename)s - %(message)s ") 60 # 3、1 把formatter对象 绑定到handler对象 61 ch.setFormatter(console_formatter) 62 fh.setFormatter(file_formatter) 63 64 logger.debug("s") 65 logger.info("d") 66 logger.warning("g") 67 logger.error("a324") 68 logger.info("db backup 2314") 69 70 # globl debug 71 # console info 72 # file warning 73 74 # 全局设置为DEBUG后,console handler 设置为INFO,如果输出的日志级别是debug,那就不输出 75 76 """ 77 日志自动截断 78 """ 79 # 按文件大小截断 80 # from logging import handlers 81 # fh = handlers.RotatingFileHandler("web.log", maxBytes=100, backupCount=13) # 文件最大100个字节,最多保留3个文件,时间最早的删除 82 # 按时间长短截断 83 # from logging import handlers 84 # fh = handlers.TimedRotatingFileHandler("web.log",when="S",interval=5,backupCount=3)