python logging模块详解_logging.getlogger(name)-CSDN博客
python的logging模块详解-filters,handlers,formatters,loggers | json配置(2) - 进击的davis - 博客园 (cnblogs.com)
Python入门:常用模块—logging模块 - 知乎 (zhihu.com)
Python logging 模块之 logging.basicConfig 用法和参数详解-CSDN博客
基本介绍
Logging库是非常常用的记录日志库,通过logging
模块存储各种格式的日志,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚等
一些项目逐渐做大,继续使用print
就很不现实,毕竟有些消息只是自己调试代码用,用户并不需要看到。
使用logging的优势:
a)你可以控制消息的级别,过滤掉那些并不重要的消息。
b)你可决定输出到什么地方,以及怎么输出。有许多的重要性别级可供选择,debug、info、warning、error 以及 critical。通过赋予 logger 或者 handler 不同的级别,你就可以只输出错误消息到特定的记录文件中,或者在调试时只记录调试信息。
import logging
# 1、创建一个logger
logger = logging.getLogger('mylogger')
logger.setLevel(logging.DEBUG)
# 2、创建一个handler,用于写入日志文件
fh = logging.FileHandler('test.log', encoding='utf-8')
fh.setLevel(logging.DEBUG)
# 再创建一个handler,用于输出到控制台
ch = logging.StreamHandler()
ch.setLevel(logging.INFO) # 这里设置控制台的level,使不太重要的东西不在控制台输出
# 3、定义handler的输出格式(formatter)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# 4、给handler添加formatter
fh.setFormatter(formatter)
ch.setFormatter(formatter)
# 5、给logger添加handler
logger.addHandler(fh)
logger.addHandler(ch)
# 开始输出信息吧!
logger.debug('不太重要的消息')
logger.info('比较重要的信息!')
logger.error('一个报错!!')
运行上述代码,控制台会输出:
2024-03-20 16:32:49,266 - mylogger - INFO - 比较重要的信息!
2024-03-20 16:32:49,266 - mylogger - ERROR - 一个报错!!
可以发现忽略了一条 ’不太重要的信息‘,而这条信息可以在test.log这个文件夹中被找到。
日志的级别
logging库中的很多组件都可以设置其level,level的规则如下,一共有5个规则:CRITICAL、ERROR、WARNING、INFO 和 DEBUG,级别逐渐递增,CRITICAL 是最高级别,DEBUG 是最低级别。
示例代码如下:
import logging
logging.basicConfig(level=logging.DEBUG)
logging.info('如果级别为最低级的 DEBUG,则打印所有的消息')
logging.debug('debug message')
logging.info('info message')
logging.warning('warning message')
logging.error('error message')
logging.critical('critical message')
"""输出
INFO:root:如果级别为最低级的 DEBUG,则打印所有的消息
DEBUG:root:debug message
INFO:root:info message
WARNING:root:warning message
ERROR:root:error message
CRITICAL:root:critical message
"""
import logging
logging.basicConfig(level=logging.WARNING)
logging.critical('此时 WARNING 等级以下的信息都不会被打印出来')
logging.debug('debug message')
logging.info('info message')
logging.warning('warning message')
logging.error('error message')
logging.critical('critical message')
"""输出
CRITICAL:root:此时 WARNING 等级以下的信息都不会被打印出来
WARNING:root:warning message
ERROR:root:error message
CRITICAL:root:critical message
"""
日志回滚和备份
Python logging.handlers模块,RotatingFileHandler、TimedRotatingFileHandler 处理器各参数详细介绍-CSDN博客
**RotatingFileHandler**
日志记录到文件中,且支持指定日志文件大小,备份文件数量
logging.handlers.RotatingFileHandler(filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=False)
参数:
-
maxBytes
:日志文件大小,单位为字节 -
backupCount
:备份文件数量
注意:当maxBytes
或backupCount
中的任何一个为零,则不会发生轮换备份。
给出一个案例:
import logging
from logging.handlers import RotatingFileHandler
logger = logging.getLogger('mylogger')
logger.setLevel(logging.INFO)
handler = RotatingFileHandler(filename='test.log', maxBytes=6, backupCount=3)
logger.addHandler(handler)
for i in range(10):
logger.info("Hello%d" % i)
输出4个日志文件,文件名及文件内容分别如下:
# test.log
Hello9
# test.log.1
Hello8
# test.log.2
Hello7
# test.log.3
Hello6
具体的机理如下:
-
文件最新内容始终输出在
test.log
基本日志文件中; -
test.log
大小达到设定的maxBytes
时,如果再有日志写入,则新生成一个test.log
,并将原来的test.log
重命名为test.log.1
,将原来的test.log.1
(如果有)重命名为test.log.2
,将原来的test.log.2
(如果有)重命名为test.log.3
,将原来的test.log.3
(如果有)删除(因为只备份3个)
组件介绍
格式器Formatter
格式器可以初始化日志记录的内容格式,结合LogRecord对象提供的属性,可以设置不同的日志格式
logging.Formatter(fmt=None, datefmt=None, style='%')
参数:
-
fmt:日志格式参数,默认为None,如果不特别指定fmt,则使用’%(message)s’格式
-
datafmt:时间格式参数,默认为None,如果不特别指定datafmt,则使用formatTime()文档中描述的格式。
-
style:风格参数,默认为’%’,也支持’$’,’{'格式
示例代码:
import logging
# 创建日志器对象
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
# 设置handler
console_handler = logging.StreamHandler()
# 添加处理器
logger.addHandler(console_handler)
# 设置格式
formatter = logging.Formatter('%(asctime)s %(created)f %(name)s %(levelname)s %(filename)s %(funcName)s '
'%(levelno)s %(lineno)d %(module)s %(msecs)d %(pathname)s %(process)d '
'%(processName)s %(relativeCreated)d %(thread)d %(threadName)s %(message)s')
console_handler.setFormatter(formatter)
# formatter = logging.Formatter('${name} - ${levelname} - ${message}', style='$')
# formatter = logging.Formatter('{name} - {levelname} - {message}', style='{')
if __name__ == '__main__':
# 输出日志记录
logger.debug("============【开始测试】====================")
logger.info("============【开始测试】====================")
logger.warning("============【开始测试】====================")
logger.error("============【开始测试】====================")
logger.critical("============【开始测试】====================")
输出如下:
2020-05-21 17:59:00,306 1590055140.306499 __main__ DEBUG test_logger_formatter.py <module> 10 23 test_logger_formatter 306 E:/PyProject/Test_Pratice/test_logger_formatter.py 21872 MainProcess 0 22460 MainThread ============【开始测试】====================
2020-05-21 17:59:00,306 1590055140.306499 __main__ INFO test_logger_formatter.py <module> 20 24 test_logger_formatter 306 E:/PyProject/Test_Pratice/test_logger_formatter.py 21872 MainProcess 0 22460 MainThread ============【开始测试】====================
2020-05-21 17:59:00,306 1590055140.306499 __main__ WARNING test_logger_formatter.py <module> 30 25 test_logger_formatter 306 E:/PyProject/Test_Pratice/test_logger_formatter.py 21872 MainProcess 0 22460 MainThread ============【开始测试】====================
2020-05-21 17:59:00,306 1590055140.306499 __main__ ERROR test_logger_formatter.py <module> 40 26 test_logger_formatter 306 E:/PyProject/Test_Pratice/test_logger_formatter.py 21872 MainProcess 0 22460 MainThread ============【开始测试】====================
2020-05-21 17:59:00,306 1590055140.306994 __main__ CRITICAL test_logger_formatter.py <module> 50 27 test_logger_formatter 306 E:/PyProject/Test_Pratice/test_logger_formatter.py 21872 MainProcess 0 22460 MainThread ============【开始测试】====================
常用的格式参数
-
%(levelno)s
: 打印日志级别的数值 -
%(levelname)s
: 打印日志级别名称 -
%(pathname)s
: 打印当前执行程序的路径,其实就是sys.argv[0] -
%(filename)s
: 打印当前执行程序名 -
%(funcName)s
: 打印日志的当前函数 -
%(lineno)d
: 打印日志的当前行号 -
%(asctime)s
: 打印日志的时间 -
%(thread)d
: 打印线程ID -
%(threadName)s
: 打印线程名称 -
%(process)d
: 打印进程ID -
%(message)s
: 打印日志信息
额外模块
为logging加上颜色
python logging日志根据等级适配颜色_python notebook logging 颜色-CSDN博客
这里需要用到一个新的库ColoredFormatter
示例代码:
import logging
from colorlog import ColoredFormatter
formatter = ColoredFormatter(
# log_color设置颜色,如果使用reset,则后续颜色不改变,可使用第八行配置运行下看下效果
"%(log_color)s%(levelname)s %(asctime)s %(module)s:%(lineno)d %(message)s",
# "%(log_color)s%(levelname)-8s%(reset)s %(log_color)s%(message)s",
datefmt=None,
reset=True,
#设置不同等级颜色
log_colors={
'DEBUG': 'fg_thin_cyan',
'INFO': 'thin_green',
'WARNING': 'yellow',
'ERROR': 'red',
'CRITICAL': 'red',
},
secondary_log_colors={},
style='%'
)
handler = logging.StreamHandler()
handler.setFormatter(formatter)
logger=logging.getLogger('test')
logger.setLevel(logging.DEBUG)
logger.addHandler(handler)
logger.debug('debug')
logger.info('info')
logger.warning('waring')
logger.error('error')
logger.critical('critical')
[文章导入自 http://qzq-go.notion.site/56a153a7046140839193556f451fe442 访问原文获取高清图片]