MST

星途 面试题库

面试题:Python应用程序错误日志记录的基础实现

请描述如何在Python应用程序中使用内置的logging模块来记录错误日志。假设应用程序有多个模块,如何确保日志记录在不同模块中都能正确配置且有序输出?给出具体的代码示例。
25.0万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试
  1. 基本配置
    • 首先导入logging模块。在Python应用程序中,要使用logging模块记录错误日志,可通过以下基本步骤:
    • 使用logging.basicConfig来进行基础配置,例如设置日志级别、日志格式等。
    • 以下是一个简单示例:
import logging

# 配置日志
logging.basicConfig(
    level = logging.ERROR,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    filename='error.log'
)

try:
    result = 1 / 0
except ZeroDivisionError as e:
    logging.error(f"发生错误: {e}", exc_info=True)
  1. 多模块配置
    • 在多模块应用程序中,为确保日志记录在不同模块中都能正确配置且有序输出,可以在每个模块中获取各自的logger实例。
    • 主模块配置日志,子模块通过logging.getLogger(__name__)获取logger
    • 以下是具体代码结构:
    • 主模块main.py
import logging
import submodule

# 配置日志
logging.basicConfig(
    level = logging.ERROR,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    filename='error.log'
)

def main():
    try:
        submodule.do_something()
    except Exception as e:
        logging.error(f"主模块捕获到错误: {e}", exc_info=True)

if __name__ == "__main__":
    main()
  • 子模块submodule.py
import logging

logger = logging.getLogger(__name__)

def do_something():
    try:
        result = 1 / 0
    except ZeroDivisionError as e:
        logger.error(f"子模块发生错误: {e}", exc_info=True)

上述代码中,basicConfig设置了日志级别为ERROR,意味着只有错误级别及以上的日志会被记录。日志格式包含时间、模块名、日志级别和日志信息,并将日志输出到error.log文件中。在多模块情况下,每个模块通过getLogger(__name__)获取自己的logger实例,这样不同模块的日志记录可以有序且正确配置。exc_info=True参数会在日志中记录异常的详细信息,便于调试。