前戏
import logging logging.debug('debug message') # 调试模式 logging.info('info message') # 基础信息 logging.warning('warning message') # 警告 logging.error('error message') # 错误 logging.critical('critical message') # 严重错误
结果:
WARNING:root:warning message ERROR:root:error message CRITICAL:root:critical message
打印出了warning及以上的信息,python解释器默认的
设置日志级别
import logging logging.basicConfig(level=logging.DEBUG) # 设置输出的日志级别 logging.debug('debug message') logging.info('info message') logging.warning('warning message') logging.error('error message') logging.critical('critical message')
结果:
DEBUG:root:debug message INFO:root:info message WARNING:root:warning message ERROR:root:error message CRITICAL:root:critical message
将日志写到文件
import logging logging.basicConfig(filename='exa.log', level=logging.INFO) logging.debug('this message should go to the log file') logging.info('so should this') logging.warning('And this,too')
这句中的level=loggin.INFO意思是,把日志纪录级别设置为INFO,也就是说,只有比日志是INFO或比INFO级别更高的日志才会被纪录到文件里,在这个例子, 第一条日志是不会被纪录的,如果希望纪录debug的日志,那把日志级别改成DEBUG就行了。
给日志加上时间
import logging logging.basicConfig(filename='exa.log', level=logging.INFO, format='%(asctime)s %(message)s', datefmt='%Y-%m-%d %H:%M:%S %p') logging.debug('this message should go to the log file') logging.info('so should this') logging.warning('And this,too')
结果
2020-09-20 22:08:26 PM so should this 2020-09-20 22:08:26 PM And this,too
把日志同时打印在屏幕上和写在日志里
import logging logger = logging.getLogger('TEST-LOG') logger.setLevel(logging.INFO) # 设置一个全局的日志级别,局部的比全局的级别低时,以全局的为准 ch = logging.StreamHandler() # 往屏幕上输出日志 ch.setLevel(logging.DEBUG) # 屏幕上的日志级别设置为debug fh = logging.FileHandler("access.log") # 往文件里输出日志 fh.setLevel(logging.WARNING) # 文件里的日志级别 为warning # 定义日志格式,%(name)s是上面定义的这个值 # %(lineno)d 哪一行打印的日志 formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') file_formatter = logging.Formatter('%(asctime)s -%(lineno)d- %(levelname)s - %(message)s') # 添加formatter到屏幕和文件里 ch.setFormatter(formatter) fh.setFormatter(file_formatter) # 添加屏幕和文件日志到logger里 logger.addHandler(ch) logger.addHandler(fh) logger.debug('debug message') logger.info('info message') logger.warning('warn message') logger.error('error message') logger.critical('critical message')
结果:
屏幕上 2018-05-19 13:57:22,611 - TEST-LOG - INFO - info message 2018-05-19 13:57:22,611 - TEST-LOG - WARNING - warn message 2018-05-19 13:57:22,611 - TEST-LOG - ERROR - error message 2018-05-19 13:57:22,612 - TEST-LOG - CRITICAL - critical message 文件access.log里 2018-05-19 14:03:54,785 -29- WARNING - warn message 2018-05-19 14:03:54,785 -30- ERROR - error message 2018-05-19 14:03:54,785 -31- CRITICAL - critical message
例
import logging # create logger logger = logging.getLogger('TEST-LOG') logger.setLevel(logging.DEBUG) # create console handler and set level to debug ch = logging.StreamHandler() ch.setLevel(logging.DEBUG) # create file handler and set level to warning fh = logging.FileHandler("access.log") fh.setLevel(logging.WARNING) # create formatter formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') # add formatter to ch and fh ch.setFormatter(formatter) fh.setFormatter(formatter) # add ch and fh to logger logger.addHandler(ch) logger.addHandler(fh) # 'application' code logger.debug('debug message') logger.info('info message') logger.warning('warn message') logger.error('error message') logger.critical('critical message')
结果:
2020-09-20 22:10:41,825 - TEST-LOG - DEBUG - debug message 2020-09-20 22:10:41,825 - TEST-LOG - INFO - info message 2020-09-20 22:10:41,825 - TEST-LOG - WARNING - warn message 2020-09-20 22:10:41,825 - TEST-LOG - ERROR - error message 2020-09-20 22:10:41,825 - TEST-LOG - CRITICAL - critical message
创建一个logger对象
创建一个文件管理操作符
创建一个屏幕管理操作符
创建一个日志输出的格式
文件管理操作符 绑定一个 格式
屏幕管理操作符 绑定一个 格式
logger对象 绑定 文件管理操作符
logger对象 绑定 屏幕管理操作符
import logging # 创建一个logger对象 logger = logging.getLogger() # 创建一个文件管理操作符 fh = logging.FileHandler('logger.log', encoding='utf-8') # 创建一个屏幕管理操作符 sh = logging.StreamHandler() # 创建一个日志输出的格式 format1 = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') # 文件管理操作符 绑定一个 格式 fh.setFormatter(format1) # 屏幕管理操作符 绑定一个 格式 sh.setFormatter(format1) logger.setLevel(logging.DEBUG) # logger对象 绑定 文件管理操作符 # logger.addHandler(fh) # logger对象 绑定 屏幕管理操作符 logger.addHandler(sh) logger.debug('debug message') # 调试模式 logger.info('我的信息') # 基础信息 logger.warning('warning message') # 警告 logger.error('error message') # 错误 logger.critical('critical message') # 严重错误
结果:
2020-09-20 22:11:36,115 - root - DEBUG - debug message 2020-09-20 22:11:36,115 - root - INFO - 我的信息 2020-09-20 22:11:36,115 - root - WARNING - warning message 2020-09-20 22:11:36,115 - root - ERROR - error message 2020-09-20 22:11:36,115 - root - CRITICAL - critical message
例
import logging from logging import handlers logger = logging.getLogger(__name__) log_file = "timelog.log" fh = handlers.TimedRotatingFileHandler(filename=log_file, when="S", interval=5, backupCount=3) formatter = logging.Formatter('%(asctime)s %(module)s:%(lineno)d %(message)s') fh.setFormatter(formatter) logger.addHandler(fh) logger.warning("test1") logger.warning("test12") logger.warning("test13") logger.warning("test14")
结果:
2020-09-20 22:13:10,481 tests:17 test1 2020-09-20 22:13:10,483 tests:18 test12 2020-09-20 22:13:10,483 tests:19 test13 2020-09-20 22:13:10,483 tests:20 test14