功能:格式化输出日志
五个级别DEBUG,INFO,WARING,ERROR,CRITICAL,默认打印WARING以上级别输入,可更改。
默认实例是root,建议使用时不要使用默认实例

import logging
import sys
使用的时候新建实例:
# 实例化logging,必须给定一个name,默认是root,不推荐。
logger_instence = logging.getLogger("name")  

# 设置实例级别,INFO以上才会显示,默认显示WARING以上。(可选择设置)
logger_instence.setLevel(logging.INFO)          

# 设置日志格式,默认格式:日志级别:实例名:信息
formatter = logging.Formatter('%(asctime)s %(levelname)-8s: %(message)s')

# 指定日志处理方法,比如打印到屏幕,存储到文件等,本例存储到文件
file_handler = logging.FileHandler("test.log")
file_handler.setFormatter(formatter)  # 可以通过setFormatter指定输出格式
file_handler.formatter = formatter        # 也可以给file_handler的formatter属性直接赋值

#再创建一个打印到屏幕的handler
print_handler = logging.StreamHander(sys.stdout)
print_handler.setFormatter(formatter)

# 把指定的日志处理方法添加到实例,可以添加多个日志处理方法
logger_instence.addHandler(file_handler)                     # 负责存储到文件
logger_instence.addHandler(print_handler)                   # 负责打印到屏幕

# logger_instence,在屏幕显示的同时,把日志存储到文件
logger_instence.debug(“这是一个debug测试”)
logger_instence.info(“这是一个info测试”)
logger_instence.warning(“这是一个waring测试”)
logger_instence.error(“这是一个error测试”)
logger_instence.critical(“这是一个critical测试”)

重复调用logging模块,重复输出
主要是因为logger.addHandler,每调用一次就加一次。
所以可以通过下面两个方法避免。
1、使用removeHandler()把这个logger里的handler移除掉
2、在log方法里做判断,如果这个logger已有handler,则不再添加handler。
logger_instence实例后添加。

logger_instence = logging.getLogger("name")  
if not logger_instence.Handlers:
...

关于logger,以上是基本的使用方法,或者说是一个简单的模板,更高级的使用是需要不断实践的,自认为没有下面这两位写的好,理解了下面两位logging模块的文章。

https://www.jianshu.com/p/feb86c06c4f4
http://python.jobbole.com/86887/