logging 模块简单使用记录

文章目录

1、logging 基本架构

  • LogRecord类: 一个实例就是一条日志记录信息

  • Logger 类: 生成日志记录(LogRecord)的主类,按照相应配置和调用的方法生成一条条不同日记记录(LogRecord)

  • Formatter类: 控制日志输出格式的类,格式化日志文本内容

  • Filter 类: 过滤日志记录(LogRecord)的类,过滤日志的级别或包含某些关键字的日志

  • Handler 类: 处理日志记录(LogRecord)的类,修改日志记录格式(通过Formatter),控制日志输出位置(控制台、文件、远程服务器等)

2、Logger 日志记录器及基础配置

2.1 基础配置函数logging.basicConfig()

logging.basicConfig(args) 用于快速设置日志系统基本配置,若不设置,默认采用BASIC_FORMAT文本格式输出控制台sys.stderr

​ args配置参数:

  • filename: 日志输出文件名,若指定则默认启用FileHandler

  • filemode: 若日志输出到文件,指定日志文件写入方式(a:追加;w:覆盖写入)

  • encoding: 若日志输出文件,指定filename日志文件编码

  • format: 日志记录输出文本格式

    • %(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
    • %(processName)s:打印进程名称
    • %(module)s:打印模块名称
    • %(name)s:日志记录器的名称
    • %(message)s:打印日志信息的内容
  • datefmt: 日志记录输出日期格式 '%Y-%m-%d %H:%M:%S'

  • style: 与format一起使用,指定文本格式化时占位符('%', '{', '$'),默认%

  • level: 日志级别

    • logging.DEBUG
    • logging.INFO
    • logging.WARNING
    • logging.ERROR
    • logging.CRITICAL
  • stream: 指定日志输出的StreamHandler,如 sys.stdout、sys.stderr

Python 复制代码
import logging
import sys

# 日志配置
logging.basicConfig(format='{asctime}:{levelname} {name}.py {message}', 
                    datefmt='%Y-%m-%d %H:%M:%S',
                    style='{',
                    level=logging.DEBUG,
                    stream=sys.stdout
                   )

# 注: logging.basicConfig()函数配置,对于直接使用logging.Logger(name)类创建的日志logger对象不起作用,需要单独设置特定的日志处理器和格式化器。
# logging.basicConfig() 的主要目的是为应用程序设置基本的日志配置,它只在调用时对 "根日志记录器" 起作用,并且只会在第一次调用时生效。对于通过 logging.getLogger(name) 获取的命名日志记录器,如果未设置特定的处理器和格式化器,它们会继承 "根日志记录器" 的配置。

# 日志输出
logger = logging.getLogger('test')
logger.info('日志提示信息')
logger.warning('日志警告信息')
logger.error('日志错误信息')
logger.critical('日志严重信息')

3、Handler 日志处理器 、 Formatter 格式化器和 Filterer 日志过滤器

3.1 logging 模块提供的 Handler:官方网址

  • StreamHandler: 将日志消息输出到标准输出或者标准错误输出流(sys.stdout 或 sys.stderr)。
  • FileHandler: 将日志消息输出到指定的文件中。
  • RotatingFileHandler: 在达到指定的大小时自动创建新的日志文件,用于控制日志文件大小的日志处理程序。
  • TimedRotatingFileHandler: 在达到指定的时间间隔或者指定的时间时创建新的日志文件,用于按时间轮换日志文件的处理程序。
  • SocketHandler: 将日志消息发送到网络 socket 上,用于通过网络发送日志消息的处理程序。
  • DatagramHandler: 将日志消息作为 UDP 数据包发送到网络上的远程服务器,用于通过 UDP 协议发送日志消息的处理程序。
  • SysLogHandler: 将消息发送到Unix syslog守护进程,可能在远程机器上,适用于将日志记录到系统级日志的处理程序。
  • NTEventLogHandler: 将向Windows NT/2000/XP事件日志发送消息,用于在 Windows 系统上记录日志消息的处理程序。
  • SMTPHandler: 将日志消息作为电子邮件发送到指定的邮件地址,用于通过电子邮件发送日志消息的处理程序。
  • MemoryHandler: 缓存日志消息到内存中的循环缓冲区,并在达到指定的容量时触发处理程序来处理日志消息。
  • HTTPHandler: 将日志消息通过 HTTP 协议发送到远程服务器上的 Web 服务器,用于通过 HTTP 发送日志消息的处理程序。
  • NullHandler: 空处理程序,不对日志消息进行任何处理,用于在不需要实际记录日志的情况下使用。
  • WatchedFileHandler: 监视指定的文件,如果文件发生变化,将重新打开该文件并继续写入日志消息,用于监视文件并写入日志的处理程序。
python 复制代码
import logging
import sys

logger = logging.Logger('handler 测试')   # 创建一个未绑定handler的logger对象
logger.setLevel(level=logging.WARNING)   # 设置日志记录级别

# StreamHandler  工作台输出
stream_handler = logging.StreamHandler(stream=sys.stdout)  # 重定向到控制台标准输出
stream_handler.setLevel(logging.INFO)
formatter = logging.Formatter(fmt='{asctime}:{levelname} {name}.py {message}',datefmt='%Y-%m-%d %H:%M:%S',style='{')
stream_handler.setFormatter(formatter)

# filterer 日志过滤器
class MyFilter(logging.Filter):
    def filter(self,record):
        return True if '000' not in record.msg else False  # 控制台输出过滤掉含"000"日志
stream_handler.addFilter(MyFilter())


# FileHandler 日志文件输出
file_handler = logging.FileHandler(filename='./data/log.out',encoding='utf-8')  # 日志输出文件
file_handler.setLevel(logging.INFO)
formatter1 = logging.Formatter(fmt='{asctime}:{levelname} {message}',datefmt='%Y-%m-%d %H:%M:%S',style='{')
file_handler.setFormatter(formatter1)


# 添加处理器
logger.addHandler(stream_handler)
logger.addHandler(file_handler)

a = logger.info('日志提示信息')
logger.warning('日志警告信息')
logger.error('日志错误信息')
logger.critical('0000日志严重信息')
  • 控制台输出

  • 日志输出文件

注: 一个logger日志记录器可以添加多个日志处理器,handler日志处理器和logger日志记录器 同时设置 level 以最高的级别为准

4、输出python 错误信息 tracebak

Python 复制代码
import logging

logger = logging.getLogger('追踪错误')

try:
    res = 2/0
except Exception:
    logging.error('failed',exc_info=True)  # 设置参数exc_info
    

5、使用配置文件,动态地配置日志记录器、处理器、过滤器和格式化器

5.1 创建配置文件setting.py

Python 复制代码
import sys
# logging 配置
LOGGING = {
    'version':1,
    'disable_existing_loggers':False,
    'formatters':{
        # 定义格式化器
        'formatter1':{
            'format':'{asctime}:{levelname} 被调用 {message}',
            'style':'{'  
        },
         'formatter2':{
            'format':'{asctime}:{levelname}-{module}.py-{message}',
            'style':'{'  
        }
    },
    
    'handlers':{
        # 定义日志处理器
        'handler1':{
            'level':'DEBUG',
            'class':'logging.StreamHandler',
            'formatter':'formatter1',
            'stream':sys.stdout
        },
        'handler2':{
            'level':'DEBUG',
            'class':'logging.FileHandler',
            'formatter':'formatter2',
            'filename':'./data/log.out'
        }  
    },
    
    'loggers':{
        # 自定义日志记录器
        'logger1':{
            'level':'INFO',
            'handlers':['handler1','handler2'],
            'propagate':False # 设置为0表示不传播日志消息到父级Logger 
        },
        'logger2':{
            'level':'INFO',
            'handlers':['handler1'],
            'propagate':False # 设置为0表示不传播日志消息到父级Logger            
        }
        
    },

}

5.2 使用配置

Python 复制代码
import logging 
from setting import LOGGING

# 加载配置
logging.config.dictConfig(LOGGING)

logger = logging.getLogger('logger2') # 调用配置文件中logger2 日志记录器
logger.info('调用logger2')
相关推荐
fg_4113 分钟前
无网络安装ionic和运行
前端·npm
理想不理想v4 分钟前
‌Vue 3相比Vue 2的主要改进‌?
前端·javascript·vue.js·面试
酷酷的阿云14 分钟前
不用ECharts!从0到1徒手撸一个Vue3柱状图
前端·javascript·vue.js
微信:1379712058717 分钟前
web端手机录音
前端
齐 飞22 分钟前
MongoDB笔记01-概念与安装
前端·数据库·笔记·后端·mongodb
云空23 分钟前
《Python 与 SQLite:强大的数据库组合》
数据库·python·sqlite
暮毅27 分钟前
10.Node.js连接MongoDb
数据库·mongodb·node.js
wowocpp30 分钟前
ubuntu 22.04 server 格式化 磁盘 为 ext4 并 自动挂载 LTS
服务器·数据库·ubuntu
九圣残炎31 分钟前
【从零开始的LeetCode-算法】1456. 定长子串中元音的最大数目
java·算法·leetcode
wclass-zhengge33 分钟前
Netty篇(入门编程)
java·linux·服务器