Python中使用logging和traceback模块记录日志和跟踪异常

  • Post category:Python

Python是一门非常流行的编程语言,在进行开发工作时,我们难免需要记录日志和跟踪异常等操作。Python提供了logging和traceback模块,方便我们进行相应的操作。下面将分别介绍logging和traceback模块的使用。

使用logging模块记录日志

logging是Python自带的日志模块,能够方便地记录各类日志信息,如调试信息、警告信息和错误信息等。使用logging模块记录日志的步骤如下:

创建logger对象

首先需要创建一个logger对象,用于记录日志。logger对象是logging模块中最基本的对象,用于发送日志消息到不同的输出目的地。例如:

import logging

logger = logging.getLogger()

配置logger对象

在创建完logger对象后,需要进行相应的配置。可以通过设置logger对象的不同属性来实现配置。例如,可以设置日志级别、输出格式、输出目的地等。示例代码如下:

import logging

logger = logging.getLogger()

# 设置日志级别为DEBUG
logger.setLevel(logging.DEBUG)

# 创建一个输出到控制台的handler
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)

# 创建一个输出到文件的handler
file_handler = logging.FileHandler(filename='test.log', encoding='utf-8')
file_handler.setLevel(logging.DEBUG)

# 设置输出格式
formatter = logging.Formatter(
    '%(asctime)s %(levelname)s [%(threadName)s:%(module)s:%(funcName)s:%(lineno)d] %(message)s'
)

# 将格式应用到handler
console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)

# 添加handler到logger对象中
logger.addHandler(console_handler)
logger.addHandler(file_handler)

记录日志信息

配置好logger对象后,就可以使用logger对象来记录不同级别的日志信息了。示例代码如下:

import logging

logger = logging.getLogger()

# 记录debug级别的日志信息
logger.debug('This is a debug message')

# 记录info级别的日志信息
logger.info('This is an info message')

# 记录warning级别的日志信息
logger.warning('This is a warning message')

# 记录error级别的日志信息
logger.error('This is an error message')

# 记录critical级别的日志信息
logger.critical('This is a critical message')

示例1

下面是一个使用logging模块记录日志的完整示例,可以记录到日志文件和控制台。

import logging

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

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

file_handler = logging.FileHandler(filename='test.log', encoding='utf-8')
file_handler.setLevel(logging.DEBUG)

formatter = logging.Formatter(
    '%(asctime)s %(levelname)s [%(threadName)s:%(module)s:%(funcName)s:%(lineno)d] %(message)s'
)

console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)

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

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

示例2

下面是一个使用logging模块记录日志的完整示例,可以记录到日志文件中。

import logging

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

file_handler = logging.FileHandler(filename='test.log', encoding='utf-8')
file_handler.setLevel(logging.DEBUG)

formatter = logging.Formatter(
    '%(asctime)s %(levelname)s [%(threadName)s:%(module)s:%(funcName)s:%(lineno)d] %(message)s'
)

file_handler.setFormatter(formatter)

logger.addHandler(file_handler)

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

使用traceback模块跟踪异常

traceback是Python自带的异常处理模块,可以方便地打印异常信息和调用栈信息。使用traceback模块跟踪异常的步骤如下:

引发异常

首先需要引发一个异常,使程序进入异常处理流程。示例代码如下:

import traceback

def divide(x, y):
    return x / y

try:
    result = divide(1, 0)
except Exception as e:
    traceback.print_exc()

打印异常信息和调用栈信息

在捕获到异常后,可以使用traceback模块打印异常信息和调用栈信息。示例代码如下:

import traceback

def divide(x, y):
    return x / y

try:
    result = divide(1, 0)
except Exception as e:
    traceback.print_exc()

示例1

下面是一个使用traceback模块跟踪异常的完整示例。

import traceback

def divide(x, y):
    return x / y

try:
    result = divide(1, 0)
except Exception as e:
    traceback.print_exc()

示例2

下面是一个使用traceback模块跟踪异常的完整示例,可以将异常信息记录到日志文件中。

import logging
import traceback

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

file_handler = logging.FileHandler(filename='test.log', encoding='utf-8')
file_handler.setLevel(logging.DEBUG)

formatter = logging.Formatter(
    '%(asctime)s %(levelname)s [%(threadName)s:%(module)s:%(funcName)s:%(lineno)d] %(message)s'
)

file_handler.setFormatter(formatter)

logger.addHandler(file_handler)


def divide(x, y):
    return x / y

try:
    result = divide(1, 0)
except Exception as e:
    logger.error(traceback.format_exc())