欢迎访问宙启技术站
智能推送

Pythonlogging.handlers模块详解及应用实例

发布时间:2023-12-11 16:30:09

Python提供了logging模块来进行日志管理。在logging模块中,我们可以通过handlers模块来定义和处理不同类型的日志输出。

handlers模块提供了多种类型的处理器,可以将日志输出到不同的地方,比如控制台、文件、邮件等。下面是handlers模块常用的处理器及其应用实例:

1. StreamHandler:将日志输出到控制台

import logging
from logging import handlers

logger = logging.getLogger('mylogger')
logger.setLevel(logging.DEBUG)

console_handler = handlers.StreamHandler()
console_handler.setLevel(logging.DEBUG)

formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
console_handler.setFormatter(formatter)

logger.addHandler(console_handler)

logger.debug('debug message')
logger.info('info message')
logger.warning('warning message')
logger.error('error message')

2. FileHandler:将日志输出到文件

import logging
from logging import handlers

logger = logging.getLogger('mylogger')
logger.setLevel(logging.DEBUG)

file_handler = handlers.FileHandler('mylog.log')
file_handler.setLevel(logging.DEBUG)

formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)

logger.addHandler(file_handler)

logger.debug('debug message')
logger.info('info message')
logger.warning('warning message')
logger.error('error message')

3. RotatingFileHandler:当日志文件超过一定大小时切割文件

import logging
from logging import handlers

logger = logging.getLogger('mylogger')
logger.setLevel(logging.DEBUG)

rotating_file_handler = handlers.RotatingFileHandler('mylog.log', maxBytes=1024, backupCount=3)
rotating_file_handler.setLevel(logging.DEBUG)

formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
rotating_file_handler.setFormatter(formatter)

logger.addHandler(rotating_file_handler)

logger.debug('debug message')
logger.info('info message')
logger.warning('warning message')
logger.error('error message')

4. TimedRotatingFileHandler:每隔一定时间切割日志文件

import logging
from logging import handlers

logger = logging.getLogger('mylogger')
logger.setLevel(logging.DEBUG)

timed_rotating_file_handler = handlers.TimedRotatingFileHandler('mylog.log', when='midnight', interval=1, backupCount=3)
timed_rotating_file_handler.setLevel(logging.DEBUG)

formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
timed_rotating_file_handler.setFormatter(formatter)

logger.addHandler(timed_rotating_file_handler)

logger.debug('debug message')
logger.info('info message')
logger.warning('warning message')
logger.error('error message')

5. SMTPHandler:通过邮件发送日志

import logging
from logging import handlers

logger = logging.getLogger('mylogger')
logger.setLevel(logging.WARNING)

smtp_handler = handlers.SMTPHandler(mailhost=('smtp.gmail.com', 587), fromaddr='from@example.com',
                                    toaddrs=['to@example.com'], subject='Error Log')
smtp_handler.setLevel(logging.ERROR)

formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
smtp_handler.setFormatter(formatter)

logger.addHandler(smtp_handler)

logger.debug('debug message')
logger.info('info message')
logger.warning('warning message')
logger.error('error message')

这些处理器可以根据需求进行组合使用,例如可以同时使用StreamHandler和FileHandler,将日志同时输出到控制台和文件:

import logging
from logging import handlers

logger = logging.getLogger('mylogger')
logger.setLevel(logging.DEBUG)

console_handler = handlers.StreamHandler()
console_handler.setLevel(logging.DEBUG)

file_handler = handlers.FileHandler('mylog.log')
file_handler.setLevel(logging.DEBUG)

formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)

logger.addHandler(console_handler)
logger.addHandler(file_handler)

logger.debug('debug message')
logger.info('info message')
logger.warning('warning message')
logger.error('error message')

通过handlers模块,我们可以方便地将日志输出到不同的目标,便于开发、调试和追踪问题。在实际项目中,可以根据具体需求选择合适的日志处理器,并进行相应的配置,以满足日志管理的要求。