Python logging基本使用
1、打印到控制台
import logging def log_test(): logging.debug('This is debug message') logging.warning('This is warning message') logging.info('This is info message') logging.error('This is error message') log_test()
运行结果
PS:可以看到 只有 logging.warning()和logging.error() 能打印输出到控制台,因为logging默认设置的等级是 warning,等级低于warning的都不会打印出来。
等级: https://docs.python.org/zh-cn/3/library/logging.html
2、修改logging等级为DEBUG后,打印到控制台
import logging def log_test(): logging.basicConfig(level=logging.DEBUG) logging.debug('This is debug message') logging.warning('This is warning message') logging.info('This is info message') logging.error('This is error message') log_test()
运行结果
PS : 日志级别: debug < info < warning < error < critical
3、保存到日志文件中,通过 logging.basicConfig() 设置
# -*- coding: UTF-8 -*- import logging def saveToLogFile(): logging.basicConfig( filename = 'saveMessage.log', #保存文件路径 filemode = 'a',#保存方式,有 w 和 a 模式,默认不写为追加 a 模式 format = '%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s' #日志格式 ) logging.warning('This is warning') saveToLogFile()
运行结果
2019-08-27 14:00:58,463 - D:\E_DISK\product\eclipse\logFileDemo\src\com\logFileDemo.py[line:24] - WARNING: This is warning
PS : 这是 saveMessage.log 文件中生成的日志信息
如果在 logging.basicConfig() 设置 filename 和 filemode,则只会保存 log 到文件,不会输出到控制台
4、实现记录日志到文件的同时输出到屏幕,日志文件只有一个。
import logging import os def get_logger(filename, logger_name='ROOT', fmt=None): if not fmt: fmt = '[%(asctime)s][%(levelname)s]%(message)s' log = logging.getLogger(logger_name) # 获取日志logger log.setLevel(logging.DEBUG) # 设置记录日志等级 if not log.handlers: # 如果之前没有该logger的handlers,则添加新的handlers,否则不添加 # 如果不加该判断,当logger_name相同时会出现日志重复问题 formatter = logging.Formatter(fmt) # 记录日志的格式 stream_handler = logging.StreamHandler() # 控制台日志句柄 stream_handler.setLevel(logging.DEBUG) # 控制台等级 stream_handler.setFormatter(formatter) # 控制台输出格式 log.addHandler(stream_handler) # 添加控制台句柄 if filename: # 如果要输出到屏幕的同时保存到文件 filename = os.path.abspath(filename) # 日志文件的绝对路径 path = os.path.dirname(filename) # 日志文件的路径 if not os.path.exists(path): # 不存在则创建 os.makedirs(path) file_handler = logging.FileHandler(filename) # 文件句柄 file_handler.setLevel(logging.DEBUG) # 文件的记录等级 file_handler.setFormatter(formatter) # 文件的记录格式 log.addHandler(file_handler) # 添加文件句柄 return log # 返回句柄 def debug(): console_log = get_logger(None) # 只输出到屏幕 console_log.debug('debug message') console_log.info('info message') console_log.warning('warning message') console_log.error('error message') file_log = get_logger('log.log', 'FILE_HANDLER') # 输出到屏幕的同时记录到文件 file_log.debug('debug message1') file_log.info('info message1') file_log.warning('warning message1') file_log.error('error message1') if __name__ == '__main__': debug()
运行截图
5、实现记录日志信息到文件的同时输出到屏幕。日志文件保存十个,且回滚。
import logging import logging.handlers import os def init_logger(log_name='logs/log.log', # 日志文件的名称 logger_name='ROOT', # 日志的logger名称 max_bytes=1024 * 1024 * 1, # 每个文件的大小 backup_count=10, # 保存的日志文件个数 mode='a', # 追加的方式保存 fmt_string='[%(asctime)s][%(name)s][%(levelname)s]%(message)s', # 输出日志格式 record_level=logging.INFO, # 记录所有日志的等级,大于该等级的日志信息才会被记录 console_level=logging.INFO, # 控制台记录日志的等级,大于该等级的日志信息才会被记录 file_level=logging.INFO): # 文件记录日志的等级,大于该等级的日志信息才会被记录 log_name = os.path.abspath(log_name) # 日志名称的绝对路径 log_path = os.path.dirname(log_name) # 日志的路径 if not os.path.exists(log_path): # 不存在日志路径则创建 os.makedirs(log_path) # 创建路径 fmt = logging.Formatter(fmt_string) # 设置日志格式 logger = logging.getLogger(logger_name) # 设置logger的名称 logger.setLevel(record_level) # 设置记录所有日志的等级,大于该等级的日志信息才会被记录 if not logger.handlers: # 如果同名的logger没有handlers才添加handler,有了就不添加,否则会出现日志重复现象 stream_handler = logging.StreamHandler() # 控制台日志句柄,设置则可以打印到控制台 stream_handler.setLevel(console_level) # 设置打印到控制台日志等级 stream_handler.setFormatter(fmt) # 设置日志格式 logger.addHandler(stream_handler) # 添加控制台句柄 # 设置回滚日志句柄 rollback_handler = logging.handlers.RotatingFileHandler(log_name, mode, max_bytes, backup_count) rollback_handler.setLevel(file_level) # 设置回滚日志记录INFO以及以上信息 rollback_handler.setFormatter(fmt) # 设置日志格式 logger.addHandler(rollback_handler) # 添加回滚日志句柄 return logger # 返回句柄,以便于使用 def debug(): for i in range(5000): log = init_logger(max_bytes=1024) log.debug('info message') log.info('info message') log.warning('info message') log.error('info message') if __name__ == '__main__': debug()
运行截图