python——日志模块

        日志主要用于记录程序运行情况,以便程序报错能够快速定位到问题。Python自带日志操作模块,即logging模块。

一、Logging模块

1、日志等级划分及作用

        日志有6个等级,等级由低到高分别是NOTEST<DEBUG<INFO<WARING<ERROR<CRITICAL。其中DEBUG记录最详细的内容,WARING是默认的级别。如果需要更改日志级别,则需要手动修改日志级别。代码如下:

logging.basicConfig(level=logging.DEBUG)
2、日志输出格式设置

        日志输出格式的设置需要用到basicConfig方法,基础使用代码如下:

LOG_FORMAT = "%(asctime)s-(message)s"
logging.basicConfig(filename='log_test.log',
                    level=logging.DEBUG,
                    encoding='utf-8',
                    datefmt='%Y-%m-%d %H:%M:%S',
                    format = LOG_FORMAT)

        basicConfig方法具有多个属性,具体如下:

参数名称

说明

Filename

指日志要输出到指定的文件

Filemode

指打开文件的方式,默认为‘a’,追加写入

Datefmt

用于指定日期/时间格式

Level

用于指定日志级别

Encoding

用于指定输出日志编码格式

Format

用于指定输出日志内容,例如日志发生时间

3、Format参数值

        Format参数值具有多种配置格式,配置内容间使用连接符进行连接,可支持自定义。常用值列表:

名称

说明

%(name)s

logger 的名字

%(asctime)s

日志时间,注意可以datefmt参数设置格式

%(message)s

日志信息

%(filename)s

执行程序文件名

%(pathname)s

执行程序路径名

%(process)d

进程id

%(thread)d

线程id

%(threadName)s

线程名称

%(levelno)s

日志级别数值

%(levelname)s

日志级别名称

%(lineno)d

调用代码所在行

%(module)s

调用日志输出函数的模块

%(funcName)s

调用日志输出函数的函数名

4、日志进阶

        在项目中通过日志统一配置,不仅能够实现将程序日志统一记录在同一个文件中,也能够实现在记入文件的同时,在终端也打印日志,还能够实现将错误日志单独错误日志文件。Logging模块可以分为logger、handler、formatter和fiter4个部分,4部分的层级结构为:

4.1 Logger:

        Logger对象是应用程序代码与日志记录系统之间的接口,是日志记录的入口点,用于创建日志记录器。可以设置不同的日志级别。可以通过getlogger()获取logger对象,一般默认为root,也可以自定义。

import logging
# 默认root
logger1 = logging.getLogger()
# 设置日志级别为debug级别
logger1.level=logging.DEBUG
print(logger1)
# 结果值:<RootLogger root (DEBUG)>
# 自定义logger对象
logger2 = logging.getLogger(__name__)
print(logger2)
# 结果值:<Logger __main__ (DEBUG)>

        logger很明显的缺点是无法多进程,例如给对象logger1设置日志级别,logger2的日志级别也同时改变了。

4.2 handler:

        handler对象用于将日志记录发送到指定的位置,这个位置可以是控制台、文件、网络等。不同的handler负责将日志发送到不同的位置。常用的handler有StreamHandler(发送到控制台)、FileHandler(发送到文件)、SMTPHandler(发送到邮件)、HTTPHandler(通过HTTP发送日志)。

# 导入日志模块
import logging

logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

handler = logging.StreamHandler()
handler.setLevel(logging.DEBUG)

logger.addHandler(handler)

logger.debug("这是一个从控制台输出的DEBUG级别日志")
4.3 Formatter:

        Formatter用于设置日志输出最终格式,可以为每个handler设置不同Formatter。

# 导入日志模块
import logging

logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

handler = logging.StreamHandler()
handler.setLevel(logging.DEBUG)
# 设置日志输出格式
formatter = logging.Formatter("%(asctime)s - %(message)s", datefmt='%Y-%m-%d %H:%M:%S')
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.debug("这是一个从控制台输出的DEBUG级别日志")
4.4 Filter:

        Filter(过滤器)用于决定日志内容是否被输出,可以依据各种标准,例如日志内容、日志级别、logger名称等。而且,每个handler可以设置多个Filter。

# 导入日志模块
import logging

logger = logging.getLogger('main')
logger.setLevel(logging.DEBUG)
print(logger)

handler = logging.StreamHandler()
handler.setLevel(logging.DEBUG)
# 设置日志输出格式
formatter = logging.Formatter("%(asctime)s - %(message)s", datefmt='%Y-%m-%d %H:%M:%S')
handler.setFormatter(formatter)
logger.addHandler(handler)

# 定义 Filter 过滤器:判断给定字符 与 logger 的名称前缀是否匹配
# 默认全匹配,可选操作
flt = logging.Filter('main')
logger.addFilter(flt)
logger.debug("这是一个从控制台输出的DEBUG级别日志")

二、实例

        设置三个handler,第一个输出到文件中,记录详细日志内容;第二个输出到控制台,记录详细日志内容;第三个输出到文件中,记录ERROR级别日志内容。

1、新建配置模块log_setting1.py
# 导入日志模块
import logging
def set_log_config(set_level):

    # 得到logger对象
    logger = logging.getLogger()
    logger.setLevel(set_level)

    # 设置第一个handler
    info_handler = logging.FileHandler(filename='../settings/info_log.log', mode='a', encoding='utf-8')
    logger.addHandler(info_handler)

    # 设置第二个handler
    stream_handler = logging.StreamHandler()
    logger.addHandler(stream_handler)

    # 设置第三个handler
    err_handler = logging.FileHandler(filename='../settings/err_log.log', mode='a', encoding='utf-8')
    err_handler.setLevel(logging.ERROR)
    logger.addHandler(err_handler)

    # 设置输出格式
    formatter = logging.Formatter(fmt='%(asctime)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S')
    info_handler.setFormatter(formatter)
    stream_handler.setFormatter(formatter)
    err_handler.setFormatter(formatter)
2、新建程序入口
import logging

from settings.log_setting1 import set_log_config

set_log_config('DEBUG')

logging.info('这是一个info级别的日志')
logging.debug('这是一个debug级别的日志')
logging.warning('这是一个warning级别的日志')
logging.error('这是一个error级别的日志')
3、输出结果

        控制台输出结果为:

2024-06-28 17:17:35 - 这是一个info级别的日志
2024-06-28 17:17:35 - 这是一个debug级别的日志
2024-06-28 17:17:35 - 这是一个warning级别的日志
2024-06-28 17:17:35 - 这是一个error级别的日志

        在指定目录下生成info_log.log和err_log.log文件,在info_log.log中与控制台输出内容一致;在err_log.log中仅展示ERROR级别的日志信息。

  • 23
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值