Python学习之日志模块详解

  • Post category:Python

Python 学习之日志模块详解

前言

日志是一个有着长久历史的概念,它是一种记录程序运行情况,以便在问题出现时追踪和排查的方法。在 Python 中,我们通过日志模块来实现对程序的日志记录。

本篇攻略将详细介绍 Python 的日志模块,包括日志级别、日志格式、日志输出以及如何在程序中使用日志模块。

日志级别

Python 的日志模块提供了 5 个级别,分别是:

  • DEBUG:详细的调试信息;
  • INFO:确认程序按预期运行;
  • WARNING:表明出现非预期或不可预止的情况,但这些情况并不是错误;
  • ERROR:由于一个更严重的问题,程序未能执行某段功能;
  • CRITICAL:严重的错误。

日志的级别越高,输出的信息就越少。

日志格式

Python 的日志模块默认使用的日志格式是:%(asctime)s - %(levelname)s - %(message)s。其中,asctime 表示时间,levelname 表示日志等级,message 表示输出的信息。

你可以修改这个默认格式,来满足自己的需求。

例如,你想要增加输出文件名和行号,可以通过下面的方式来定义格式:

LOG_FORMAT = '%(asctime)s - %(levelname)s - %(filename)s - %(lineno)d - %(message)s'
logging.basicConfig(filename='example.log', level=logging.DEBUG, format=LOG_FORMAT)

日志输出

Python 的日志模块有以下 4 种输出方式:

  • StreamHandler:日志输出到控制台,也就是终端;
  • FileHandler:日志输出到文件;
  • NullHandler:不输出任何日志,通常用于测试;
  • SMTPHandler:将日志以电子邮件的方式发送。

在使用时,我们可以按需选择不同的输出方式,下面是一些例子。

控制台输出日志

import logging

logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)

logger.debug('This is a debug log')
logger.info('This is an info log')
logger.warning('This is a warning log')
logger.error('This is an error log')
logger.critical('This is a critical log')

输出文件日志

import logging

LOG_FORMAT = '%(asctime)s - %(levelname)s - %(message)s'
logging.basicConfig(filename='example.log', level=logging.DEBUG, format=LOG_FORMAT)
logger = logging.getLogger(__name__)

logger.debug('This is a debug log')
logger.info('This is an info log')
logger.warning('This is a warning log')
logger.error('This is an error log')
logger.critical('This is a critical log')

在程序中使用日志模块

通常情况下,我们在编写程序时需要记录一些日志信息来帮助我们进行调试和排查问题。下面是在程序中使用日志模块的一些示例:

基本使用

import logging

logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)

def divide(x, y):
    logger.info('divide {} by {}'.format(x, y))
    try:
        result = x / y
    except ZeroDivisionError as e:
        logger.error('error: {}'.format(e))
        return None
    else:
        logger.info('result is {}'.format(result))
        return result

divide(4, 2)
divide(4, 0)

捕获异常

import logging

logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)

try:
    raise ValueError('A value error occurred')
except Exception as e:
    logger.exception('Caught an error: {}'.format(e))

总结

以上就是 Python 日志模块的详细讲解,包括日志等级、日志格式、日志输出以及如何在程序中使用日志模块。希望这篇攻略能够帮助大家更好地理解和使用日志模块。