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()
运行截图