日志logging

本文深入解析日志系统的重要性和作用,详细介绍了日志级别的概念及其在调试、运行状况监测及故障排查中的应用。同时,文章提供了Python logging模块的全面指南,涵盖基本使用、日志格式定制、日志文件输出及高级功能,如组件详解、封装实例,帮助开发者掌握高效日志管理技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

日志就是用于记录系统运行时的信息,对一个事件的记录;也称为Log。

一、日志的作用

  • 调试程序
  • 了解系统程序运行的情况,是否正常
  • 系统程序运行故障分析与问题定位
  • 用来做用户行为分析和数据统计

二、日志级别

  • 日志级别:是指日志信息的优先级、重要性或者严重程度
  • 常见的日志级别
日志级别描述
DEBUG调试级别,打印非常详细的日志信息,通常用于对代码的调试
INFO信息级别,打印一般的日志信息,突出强调程序的运行过程
WARNING警告级别,打印警告日志信息,表明会出现潜在错误的情形,一般不影响软件的正常使用
ERROR错误级别,打印错误异常信息,该级别的错误可能会导致系统的一些功能无法正常使用
CRITICAL严重错误级别,一个严重的错误,这表明系统可能无法继续运行

说明

  1. 上面列表中的日志级别是从上到下依次升高的,即:DEBUG < INFO < WARNING < ERROR < CRITICAL;
  2. 当为程序指定一个日志级别后,程序会记录所有日志级别大于或等于指定日志级别的日志信息,而不是仅仅记录指定级别的日志信息;
  3. 一般建议只使用DEBUG、INFO、WARNING、ERROR这四个级别

三、logging 使用

Python中有一个标准库模块logging可以直接记录日志

(一)Logging 基本使用

步骤:

  1. 导包 如:import logging
  2. 调用相应的级别方法,如记录日志信息 logging.debug(“debug…”)
(二)设置级别:

logging中默认的日志级别为WARNING,程序中大于等于该级别的日志才能输出,小于该级别的日志不会被打印出来。

logging.basicConfig(level=logging.DEBUG)

注:

  1. 默认级别为:logging.WARNING;
  2. 设置级别时调用的是 logging 文件夹下面的常量,而不是调用的小写方法;
  3. 在开发环境和测试环境中,可以使用DEBUG或INFO级别的日志获取详细的日志信息:在生产环境中,通常设置成WARNING或ERROR级别。
(三)设置日志格式
  1. 默认的日志的格式
    日志级别:Logger名称:日志内容,如 WARNING:root:这是一条警告信息
  2. 自定义日志格式
logging.basicConfig(format="%(levelname)s:%(name)s:%(message)s")

format参数中可能用到的格式化信息:

占位符描述
%(name)sLogger的名字
%(levelno)s数字形式的日志级别
%(levelname)s文本形式的日志级别
%(pathname)s调用日志输出函数的模块的完整路径名,可能没有
%(filename)s调用日志输出函数的模块的文件名
%(module)s调用日志输出函数的模块名
%(funcName)s调用日志输出函数的函数名
%(lineno)d调用日志输出函数的语句所在的代码行
%(created)f当前时间,用UNIX标准的表示时间的浮 点数表示
%(relativeCreated)d输出日志信息时的,自Logger创建以来的毫秒数
%(asctime)s字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”
%(thread)d线程ID。可能没有
%(threadName)s线程名。可能没有
%(process)d进程ID。可能没有
%(message)s用户输出的消息
(四)将日志信息输出到文件中

默认情况下Python的logging模块将日志打印到控制台

  1. 将日志信息输出到文件中:
logging.basicConfig(filename="a.log")
  1. 示例代码
import logging
fmt = '%(asctime)s %(levelname)s [%(name)s] [%(filename)s(%(funcName)s:%(lineno)d)] - %(message)s'
logging.basicConfig(filename="a.log", level=logging.INFO, format=fmt)
logging.debug("调试")
logging.info("信息")
logging.warning("警告")
logging.error("错误")

四、日志的高级用法

(一) logging日志模块四大组件
组件名称类名功能描述
日志器Logger提供了程序使用日志的入口
处理器Handler将logger创建的日志记录发送到合适的目的输出
格式器Formatter决定日志记录的最终输出格式
过滤器Filter提供了更细粒度的控制工具来决定输出哪条日志记录,丢弃哪条日志记录
(二)组件之间的关系
  • 日志器(logger)需要通过处理器(handler)将日志信息输出到目标位置,如:文件、sys.stdout、网络等;
    不同的处理器(handler)可以将日志输出到不同的位置;
  • 日志器(logger)可以设置多个处理器(handler)将同一条日志记录输出到不同的位置;
  • 每个处理器(handler)都可以设置自己的格式器(formatter)实现同一条日志以不同的格式输出到不同的地
    方。
  • 每个处理器(handler)都可以设置自己的过滤器(filter)实现日志过滤,从而只保留感兴趣的日志;

简单点说就是:日志器(logger)是入口,真正干活儿的是处理器(handler),处理器(handler)还可以通过过滤器(filter)和格式器(formatter)对要输出的日志内容做过滤和格式化等处理操作。

(三)Logger类
  1. 创建Logger对象
logger = logging.getLogger()
logger = logging.getLogger("myLogger")

注:
logging.getLogger()方法有一个可选参数name,该参数表示将要返回的日志器的名称标识,如果不提供该参数,则
返回root日志器对象。 若以相同的name参数值多次调用getLogger()方法,将会返回指向同一个logger对象的引
用。
2. Logger常用的方法

方法描述
logger.debug()打印日志
logger.info()打印日志
logger.warning()打印日志
logger.error()打印日志
logger.critical()打印日志
logger.setLevel()设置日志器将会处理的日志消息的最低严重级别
logger.addHandler()为该logger对象添加一个handler对象
logger.addFilter()为该logger对象添加一个filter对象
(四)Handler类

Handler对象的作用是将消息分发到handler指定的位置,比如:控制台、文件、网络、邮件等。 Logger对象可以通过addHandler()方法为自己添加多个handler对象。

  1. 创建Handler对象
    Handler是一个基类,它只定义了Handler应该有的接口。 应该使用Handler子类来创建对象。
    logging中内置的常用的Handler包括:
Handler描述
logging.StreamHandler将日志消息发送到输出到Stream,如std.out, std.err或任何file-like对象。
logging.FileHandler将日志消息发送到磁盘文件,默认情况下文件大小会无限增长
logging.handlers.RotatingFileHandler将日志消息发送到磁盘文件,并支持日志文件按大小切割
logging.hanlders.TimedRotatingFileHandler将日志消息发送到磁盘文件,并支持日志文件按时间切割
logging.handlers.HTTPHandler将日志消息以GET或POST的方式发送给一个HTTP服务器
logging.handlers.SMTPHandler将日志消息发送给一个指定的email地址
  1. Handler常用的方法
方法描述
handler.setLevel()设置handler将会处理的日志消息的最低严重级别
handler.setFormatter()为handler设置一个格式器对象
handler.addFilter()为handler添加一个过滤器对象
(五)Formatter类

Formatter对象用于配置日志信息的格式。
创建Handler对象

formatter = logging.Formatter(fmt=None, datefmt=None, style='%')
"""
fmt:指定消息格式化字符串,如果不指定该参数则默认使用message的原始值
datefmt:指定日期格式字符串,如果不指定该参数则默认使用"%Y-%m-%d %H:%M:%S"
style:Python 3.2新增的参数,可取值为 '%', '{'和 '$',如果不指定该参数则默认使用'%'
"""

五、日志封装

# -*-coding:utf-8 -*-
# Auothor:yue_luo
# 导包
import logging.handlers
import os
# 工程目录
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
class GetLogger():

    logger = None

    @classmethod
    def get_logger(cls):
        if cls.logger is None:
            fmt = "%(asctime)s %(levelname)s [%(filename)s(%(funcName)s:%(lineno)d)] - %(message)s"
            # 创建日志器
            cls.logger = logging.getLogger()
            cls.logger.setLevel(logging.INFO)

            # 创建格式化器
            formatter = logging.Formatter(fmt)

            # 输出到控制台
            sh = logging.StreamHandler()
            sh.setFormatter(formatter)
            cls.logger.addHandler(sh)

            # 输出到文件,每日一个文件
            log_path = os.path.join(BASE_DIR, "../log", "tpshop.log").replace('\\','/')
            fh = logging.handlers.TimedRotatingFileHandler(log_path, when='MIDNIGHT', interval=1
                                                           , backupCount=3)
            fh.setFormatter(formatter)
            cls.logger.addHandler(fh)
        return cls.logger
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值