使用logging和colorlog实现日志记录可以方便地记录程序的运行情况,方便调试和分析问题。下面将详细说明如何使用logging和colorlog,并提供相应的代码示例。
首先需要安装colorlog模块。可以通过pip命令进行安装:
pip install colorlog
logging模块是Python自带的日志记录模块。logging模块提供了非常灵活的日志记录方式,可以根据不同场景需求灵活配置,同时还支持多线程处理、远程日志收集等高级功能。
logging模块中有五个主要的类:
下面分别说明这些类及其方法和属性。
Loggers类是提供应用程序可直接使用的接口。通常我们在应用程序中通过logging.getLogger()方法获取一个logger对象,然后使用这个logger对象进行日志记录。
Loggers类的主要方法:
Loggers类的主要属性:
Handlers类用于将日志记录发送到适当的目的地。例如文件、终端和网络等。常用的handler有:
Handlers类的主要方法:
Handlers类的主要属性:
Filters类提供了细粒度的日志过滤功能,可以基于任何的日志属性(例如日志级别、时间等)进行过滤。
Filters类的主要方法:
Formatters类用于控制日志信息的输出格式。常用的格式化符号有:
Formatters类的主要方法:
colorlog是一个支持颜色输出的Python日志模块。colorlog是基于logging模块的,可以方便地与logging模块一起使用。colorlog可以按照不同的日志级别为不同的级别设置不同的颜色,方便快速定位问题。
colorlog主要有如下特点:
下面是使用logging和colorlog模块记录日志的示例代码,包括写文件和不写文件两种格式。
import logging
import colorlog
def init_logger(logfile, loglevel):
"""初始化日志记录器
Args:
logfile: 日志文件名,不写入日志文件则传入None
loglevel: 日志级别,可选值为debug、info、warning、error、critical
Returns:
logger: 返回初始化后的logger对象
"""
# 创建logger对象
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
# 创建控制台输出handler
console_handler = colorlog.StreamHandler()
console_handler.setFormatter(colorlog.ColoredFormatter(
'%(log_color)s[%(asctime)s %(levelname)s] %(message)s',
datefmt='%Y-%m-%d %H:%M:%S',
log_colors={
'DEBUG': 'cyan',
'INFO': 'green',
'WARNING': 'yellow',
'ERROR': 'red',
'CRITICAL': 'red,bg_white'
}
))
logger.addHandler(console_handler)
if logfile:
# 创建文件输出handler
file_handler = logging.FileHandler(logfile, encoding='utf-8')
file_handler.setLevel(logging.DEBUG)
file_handler.setFormatter(logging.Formatter(
'%(asctime)s [%(levelname)s] %(message)s',
datefmt='%Y-%m-%d %H:%M:%S'
))
logger.addHandler(file_handler)
# 设置日志级别
if loglevel == 'debug':
logger.setLevel(logging.DEBUG)
elif loglevel == 'info':
logger.setLevel(logging.INFO)
elif loglevel == 'warning':
logger.setLevel(logging.WARNING)
elif loglevel == 'error':
logger.setLevel(logging.ERROR)
elif loglevel == 'critical':
logger.setLevel(logging.CRITICAL)
return logger
if __name__ == '__main__':
# 初始化日志记录器,不写文件
logger = init_logger(None, 'debug')
logger.debug('debug message')
logger.info('info message')
logger.warning('warning message')
logger.error('error message')
logger.critical('critical message')
# 初始化日志记录器,写文件
logger = init_logger('test.log', 'info')
logger.debug('debug message')
logger.info('info message')
logger.warning('warning message')
logger.error('error message')
logger.critical('critical message')
上述代码中,init_logger()函数用于初始化日志记录器,并返回初始化好的logger对象。该函数接收两个参数:logfile和loglevel。如果logfile为None,则不写入日志文件;如果logfile为一个文件名,则将日志信息写入该文件中。loglevel为日志级别,