初次使用logging模块觉得有点诡异,涉及到Logger、Handler、Level等概念,看代码最实际了:
import logging
import sys
logger = logging.getLogger("endlesscode")
formatter = logging.Formatter('%(name)-12s %(asctime)s %(levelname)-8s %(message)s', '%a, %d %b %Y %H:%M:%S',)
file_handler = logging.FileHandler("test.log")
file_handler.setFormatter(formatter)
stream_handler = logging.StreamHandler(sys.stderr)
logger.addHandler(file_handler)
logger.addHandler(stream_handler)
#logger.setLevel(logging.ERROR)
logger.error("fuckgfw")
logger.removeHandler(stream_handler)
logger.error("fuckgov")
文档上已经说明得很清楚了,有几个比较特别的地方:
- 如果设置了setLevel的日志等级,则调用比设定低的日志记录函数则不会有任何的输出,比如:
logger.setLevel(logging.ERROR) #没有生效,默认的info<error logger.info("fuckgfw") - 一个logger如果添加了多个handler(logger.addHandler),记录的时候会同时在多个hanlder上输出日志。
- 日志的输出格式是通过logging.Formatter来设定的,其初始化的参数如下:

- logging有一个basicConfig的成员函数,主要是用来配置一些基本的信息:
logging.basicConfig( level=logging.ERROR, format='%(name)-12s %(asctime)s %(levelname)-8s %(message)s', datefmt='%a, %d %b %Y %H:%M:%S', filename=log_file, filemode='a')文档上的说明:
Does basic configuration for the logging system by creating a StreamHandler with a default Formatter and adding it to the root logger. The functions debug(), info(), warning(), error() and critical() will call basicConfig() automatically if no handlers are defined for the root logger.
参数如下:
