在python程序中,我们一般使用logging模块来记录日志。
简单模式: 我们可以直接使用logging.info()这种方式记日志。
import logginglogging.basicConfig(filename='execution.log', format='%(asctime)s - %(levelname)s - %(message)s', encoding='utf-8', level=logging.INFO)
logging.info('这是我写的日志')
常用模式: 通常我们可能需要日志在记录到文件的同时也输出到控制台。又或者,我们可能需要区别于日志的来源,即可能由不同的模块记录的,这时我们使用logger.info()来记日志。
多个logger可以是继承关系。 所以logger都会默认继承自root logger。 指定名称的logger会按照点分隔符来控制继承链。 名称举例: myproject.settings -> myproject。
logger可能通过setLevel()方法来控制记录的日志级别,达到级别的日志会传递给handler。logger的默认日志级别是logging.WARNING。 同时handler也可以设置自己的日志级别,达到级别的日志才会最终被记录。 handler默认的日志级别是logging.DEBUG。formatter是控制日志输出格式,它需要被添加到handler上才起作用。
前面讲的logging.basicConfig方法相当于给root logger做了配置。
import logging# 为了将日志即能输出到日志文件,又能输出到控制台,采用单独创建logger,并附加handler的方式。
logger = logging.getLogger() # 不加参数,以获取root logger
logger.setLevel(LOG_LEVEL) # 设置日志级别。 默认是warning
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(process)d - %(message)s') # 设置日志输出格式, 增加进程id,为区分多进程并行处理
# handler不设置日志级别时,会将logger传给它的所有级别的日志都输出,而不是默认只输出warning级别
ch = logging.StreamHandler() # 创建控制台handler
ch.setFormatter(formatter)
fh = logging.FileHandler(filename=os.path.join(BASE_DIR, 'execution.log'), encoding='utf-8')
fh.setFormatter(formatter)
logger.addHandler(ch)
logger.addHandler(fh)
# 设置完root logger后,将logger变量指向当前模块名的logger,但其会自动继承root logger的配置
logger = logging.getLogger('main')logger.info('这是main模块中的日志')
其他模块中
import logging
# logger会自动继承root logger中的配置,包括handler, formatter, log level等。
logger = logging.getLogger(__name__)
logger.info('这是其他模块中的日志')