简单实用:
# -*- coding:utf-8 -*-
import logging
logging.debug('debug message')
logging.info('info message')
logging.warn('warn message')
logging.error('error message')
logging.critical('critical message')
输出
WARNING:root:warn message
ERROR:root:error message
CRITICAL:root:critical message
由此可知,默认配置为:
默认等级:warning
默认格式:%(levelname)s -%(name)s - %(message)s'
默认名称:root
日志等级
从上到下等级从低到高
-DEBUG:详细信息,典型地调试问题时会感兴趣
-INFO:证明事情按预期工作
-WARNING:明发生了一些意外,或者不久的将来会发生问题(如‘磁盘满了’)。软件还是在正常工作
-ERROR:由于更严重的问题,软件已不能执行一些功能了
-CRITICAL:严重错误,表明软件已不能继续运行了
几个重要的概念
-Logger 记录器,暴露了应用程序代码能直接使用的接口。
-Handler 处理器,将(记录器产生的)日志记录发送至合适的目的地。
-Filter 过滤器,提供了更好的粒度控制,它可以决定输出哪些日志记录。
-Formatter 格式化器,指明了最终输出中日志记录的布局。
原理
树形结构
工作流程
简单应用
# encoding: utf-8
#@author: chenjunhua
#time: 2019/1/10 11:52
import logging
#输出格式
formatter = logging.Formatter('%(filename)s-%(lineno)d-%(asctime)s-%(levelname)s - %(message)s')
#输出到文件
handler = logging.FileHandler("log.txt")
handler.setLevel(logging.CRITICAL)
handler.setFormatter(formatter)
#输出到屏幕
console = logging.StreamHandler()
console.setFormatter(formatter)
console.setLevel(logging.INFO)
logger = logging.getLogger(__name__)
logger.setLevel(level = logging.INFO)
logger.addHandler(handler)
logger.addHandler(console)
if __name__ == '__main__':
logger.info("Start print log")
logger.debug("Do something")
logger.warning("Something maybe fail.")
logger.info("Finish")
有用的format格式
格式 | 描述 |
---|---|
%(levelno)s | 打印日志级别的数值 |
%(levelname)s | 打印日志级别名称 |
%(pathname)s | 打印当前执行程序的路径 |
%(filename)s | 打印当前执行程序名称 |
%(funcName)s | 打印日志的当前函数 |
%(lineno)d | 打印日志的当前行号 |
%(asctime)s | 打印日志的时间 |
%(thread)d | 打印线程id |
%(threadName)s | 打印线程名称 |
%(process)d | 打印进程ID |
%(message)s | 打印日志信息 |