python-logging模块
Logging模块
用于记录程序运行时的日志
1.logging模块的用法
简单的输出到屏幕
import logging logging.warning("user attempted wrong password more than 3 times") logging.critical("server is down")
输出: WARNING:root:user attempted wrong password more than 3 times CRITICAL:root:server is down
简单写到文件
import logging logging.basicConfig(filename='example.log', level=logging.INFO) # level = loggin.INFO意思是,把日志纪录级别设置为INFO,比IFNO日志更高的级别才写入日子文件 logging.debug('This message should go to the log file') # debug的日志就不会写入 logging.info('So should this') logging.warning('And this, too')
注意:level的等级设置为logging.INFO。debug的日志不会写入文件。
自定义格式
# 自定义日志格式 logging.basicConfig(filename='log_test.log', level=logging.DEBUG, format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p') logging.warning('is when this event was logged.')
# %(name)s Logger的名字 # %(levelno)s 数字形式的日志级别 # %(levelname)s 文本形式的日志级别 # %(pathname)s 调用日志输出函数的模块的完整路径名,可能没有 # %(filename)s 调用日志输出函数的模块的文件名 # %(module)s 调用日志输出函数的模块名 # %(funcName)s 调用日志输出函数的函数名 # %(lineno)d 调用日志输出函数的语句所在的代码行 # %(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示 # %(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数 # %(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒 # %(thread)d 线程ID。可能没有 # %(threadName)s 线程名。可能没有 # %(process)d 进程ID。可能没有 # %(message)s 用户输出的消息
2.日志同时输出到屏幕和文件
操作流程
# 1.生成logger对象 # 2.生成handler对象 # 2.1.绑定logger和handler对象 # 3.生成formatter对象 # 3.1 把formatter对象绑定到handler对象 # 4.如果不设置logger级别,那么默认级别是error ,所以err时才会输出到屏幕和界面 # 5.添加日志过滤功能
# 1.生成logger对象 logger = logging.getLogger('web') # 4.设置日志级别(不设置默认级别为error) logger.setLevel(logging.INFO) # 2.生成handler对象 ch = logging.StreamHandler() # 生成输出屏幕对象 fh = logging.FileHandler('web.log') # 生成输出文件对象 # 3.生成formatter对象 # 3.1 把formatter对象绑定到handler对象 file_format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') # 指定输出文件格式 con_format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s -%(lineno)d -%(message)s') # 指定输出屏幕格式 fh.setFormatter(file_format) # 设置输出文件格式 ch.setFormatter(con_format) # 设置输出console格式 logger.addHandler(ch) logger.addHandler(fh) # 5.添加日志过滤功能类 class IgnoreBackupLogFilter(logging.Filter): """忽略带db backup 的日志""" def filter(self, record): # 固定写法 return "db backup" not in record.getMessage() # 把信息写入日志 # 添加日志过滤功能 logger.addFilter(IgnoreBackupLogFilter()) logger.debug("test ....") logger.info("test info ....") logger.warning("start to run db backup job ....") # 只有这条不写入日志 logger.error("test error ....")
3.文件截断功能
当文件越来越大,则需要进行文件截断
# 文件截断功能 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")