QZQ的小世界!

  • 首页
你好!
这里是QZQ的博客站!
  1. 首页
  2. 未分类
  3. 正文

Logging-日志模块

2025年4月4日 122点热度 0人点赞 0条评论

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 访问原文获取高清图片]

本作品采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可
标签: IT技术 Python Python库介绍 Python标准库
最后更新:2025年4月3日

QZQ

一只涉猎广泛的技术爱好者,绝赞养猫中~

点赞
< 上一篇

归档

  • 2025 年 4 月
  • 2025 年 3 月
  • 2025 年 2 月
  • 2025 年 1 月
  • 2024 年 12 月
  • 2024 年 11 月

分类

  • 技术
  • 未分类

COPYRIGHT © 2024 QZQ的小世界!. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang