python logging模块

本文详细介绍了Python中logging模块的基本概念及其使用方法,包括Logger、Handler、Formatter和Filter的作用及配置方式。并通过实例展示了如何利用logging模块进行日志记录。

作者:吕嘉伟


在loging模块的应用中,经常使用的组件有loggers、handlers、formatters、filter。

Logger: 日志类,应用程序往往通过调用它提供的api来记录日志。

Handler: 对日志信息处理,可以将日志发送(保存)到不同的目标域中。

Formatter: 日志的格式化。

Filter:对日志内容或等级的过滤。


图1 日志输出的流程

如图1所示,打印一条日志处理流程是:

1.      用户代码调用打印日志函数(logging.info(), logging.debug()等);

2.      若希望打印的日志级别不够,则流程停止。否则进入步骤3;

3.      建立一个LogRecord对象,该对象表示一条日志,并判断本条日志是否被filter过滤掉,如果被过滤,流程停止,否则进入步骤4;

4.      logger会将LogRecord传递到它所定义的handlers,进行处理,注意:handlers可以设置多个,会对一条日志进行多次处理。如果当前logger的propagate属性为0,则流程停止,否则进入步骤5;

5.      判断当前logger有无父logger,如果没有,则流程停止,否则设置当前logger为它的父logger,继续执行步骤4。

Handler的日志处理过程:

1.      如果当前LogRecord的级别小于handler所设置的LogLevel,则停止流程,否则进入步骤2。

2.      判断当前LogRecord是否被handler是否被它所设置的filter过滤,如果被过滤,则流程停止,否则日志被发送到最终的目的地。

logger

处理日志前,需要有一个logger对象,一般使用logging.getLogger(name=None)函数找到一个logger对象,当name所指定的logger不存在时,会自动创建一个该名称的对象,并保存在logging.manager的loggerDict中。

一般对logger的命名就是用模块名(__name__),目的是方便了解日志的产生位置,在这种情况下,需要设计自己的formatter和handler,或者使用parent logger提供的各种工具处理日志。表1展示了日志的等级及应用场景。

表1 日志的等级及应用场景

Level

When it’s used

DEBUG

Detailed information, typically of interest only when diagnosing problems.

INFO

Confirmation that things are working as expected.

WARNINGdefault

An indication that something unexpected happened, or indicative of some problem in the near future (e.g. ‘disk space low’). The software is still working as expected.

ERROR

Due to a more serious problem, the software has not been able to perform some function.

CRITICAL

A serious error, indicating that the program itself may be unable to continue running.

Logger常用的方法:

Logger.setLevel()  配置logger关注的日志等级,只有大于等于该等级的日志才能被处理;

Logger.addHandler()Logger.removeHandler() 添加、删除handler;

addFilter()removeFilter() 添加、删除filter;

创建日志内容的方法:Logger.debug()、 Logger.info()、 Logger.warning()Logger.error()Logger.critical()

handler

常用的日志处理器有SreamHandler和FileHandler。SreamHandler将日志输出到stream中,例如sys.stdout、sys.stderr,FileHandler将日志输出到文件中。

handler常用的方法:

setLevel() 、 setFormatter() 、 addFilter()removeFilter()

filter

可以给handler和logger添加,可通过filter修改record的等级和内容,达到特殊目的。

使用方法:
class InfoFilter(logging.Filter):
def filter(self, rec):
    # rec为LogRecord对象
        return rec.levelno == logging.INFO
logger.addFilter(InfoFilter())

使用logging的方式

1.  定义logger、handler等;

2.  logging配置文件

举例:

import logging
import logging.config

logging.config.fileConfig('logging.conf')

# create logger
logger = logging.getLogger('simpleExample')

# 'application' code
logger.debug('debug message')
logger.info('info message')
logger.warn('warn message')
logger.error('error message')
logger.critical('critical message')</span>

logging.conf:

[loggers]
keys=root,simpleExample

[handlers]
keys=consoleHandler

[formatters]
keys=simpleFormatter

[logger_root]
level=DEBUG
handlers=consoleHandler

[logger_simpleExample]
level=DEBUG
handlers=consoleHandler
qualname=simpleExample
propagate=0

[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=simpleFormatter
args=(sys.stdout,)

[formatter_simpleFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s</span>
3. logging配置字典
举例:
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
        },
    },
    'loggers': {
        'test': {
            'handlers': ['console'],
            'level': 'INFO',
        },
    },
}     
logging.config.dictConfig(LOGGING)
logger = logging.getLogger('test')
logger.info('info message dict')
logger.warn('warn message dict')
logger.error('error message dict')
logger.critical('critical message dict')

参考文献:

https://docs.python.org/2/howto/logging.html

https://docs.python.org/3/library/logging.config.html#logging-config-dictschema





<think> 我们正在回答关于Python logging模块的使用和介绍的问题。根据用户的要求,我们需要参考提供的引用内容,给出结构清晰、真实可靠的回答。 引用[1]提到:logging模块Python的标准日志记录模块,用于记录应用程序的状态、错误和调试信息。 引用[2]和[3]都强调了logging模块相比print的优点:可以设置不同日志等级,在release版本中只输出重要信息;可以决定信息输出的位置和方式。 引用[4]给出了一个基本的使用示例,展示如何配置日志级别并记录不同级别的日志。 引用[5]则提供了更详细的内容,包括日志等级、格式设置、日志保存为文件以及模块化组件的使用(日志记录器和处理器的配置)。 回答结构: 1. 介绍logging模块及其优点 2. 日志等级说明 3. 基本使用:配置和记录日志 4. 进阶使用:自定义格式、输出到文件、使用多个处理器等 5. 总结 注意:由于引用[5]内容较多,我们重点参考其结构,但根据引用内容简洁地组织。 我们按照用户要求,在回答中引用的段落末尾添加引用标识。 </think>### Python logging模块使用指南 Python的`logging`模块是标准库中的日志记录工具,相比`print()`具有以下优势: 1. **分级日志**:可设置不同日志等级(DEBUG/INFO/WARNING/ERROR/CRITICAL),在release版本中只输出关键信息[^3] 2. **灵活输出**:可指定输出到控制台、文件、网络等不同目标[^3] 3. **格式定制**:支持自定义日志格式(时间、模块名、行号等)[^5] #### 基础使用 ```python import logging # 配置基础日志设置(控制台输出) logging.basicConfig( level=logging.DEBUG, # 设置日志级别 format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' ) logging.debug('调试信息') # 开发时使用 logging.info('状态信息') # 正常运行信息 logging.warning('潜在问题') # 不影响运行的异常 logging.error('功能错误') # 影响部分功能 logging.critical('严重故障') # 导致程序崩溃 ``` 输出示例: ``` 2023-05-10 14:30:00 - root - DEBUG - 调试信息 2023-05-10 14:30:00 - root - WARNING - 潜在问题 ``` #### 进阶功能 1. **文件日志记录** ```python logging.basicConfig( filename='app.log', filemode='a', # 追加模式 level=logging.INFO ) ``` 2. **模块化组件配置** ```python # 创建记录器 logger = logging.getLogger('my_logger') logger.setLevel(logging.DEBUG) # 创建文件处理器 file_handler = logging.FileHandler('debug.log') file_handler.setLevel(logging.DEBUG) # 创建控制台处理器 console_handler = logging.StreamHandler() console_handler.setLevel(logging.ERROR) # 设置日志格式 formatter = logging.Formatter('%(levelname)s:%(name)s:%(message)s') file_handler.setFormatter(formatter) # 添加处理器 logger.addHandler(file_handler) logger.addHandler(console_handler) logger.info('业务处理完成') # 仅写入文件 logger.error('数据库异常') # 同时写入文件和控制台 ``` 3. **日志格式标记符** | 标记符 | 说明 | |--------|------| | `%(asctime)s` | 日志时间 | | `%(levelname)s` | 日志级别 | | `%(filename)s` | 文件名 | | `%(lineno)d` | 行号 | | `%(funcName)s` | 函数名 | | `%(message)s` | 日志内容 | #### 最佳实践 1. 生产环境建议使用`WARNING`级别及以上 2. 通过`RotatingFileHandler`实现日志文件轮转 3. 不同模块使用独立记录器:`logger = logging.getLogger(__name__)` 4. 使用`try-except`配合异常日志: ```python try: # 业务代码 except Exception as e: logging.exception(f"操作失败: {str(e)}") ``` 日志级别金字塔: ``` CRITICAL(最高) ↑ ERROR ↑ WARNING ↑ INFO ↓ DEBUG(最低) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值