Python案例如何输出日志

wen python案例 44

本文目录导读:

Python案例如何输出日志

  1. 最简单:使用print()函数
  2. 专业方法:使用logging模块
  3. 实际案例:模拟用户登录系统
  4. 自定义日志类
  5. 日志级别控制
  6. 最佳实践建议

我来详细介绍Python中输出日志的几种方法,从简单到专业:

最简单:使用print()函数

# 简单调试用
print("程序开始运行")
result = 10 + 20
print(f"计算结果: {result}")
print("程序结束")

缺点:无法控制日志级别,不能灵活控制输出位置

专业方法:使用logging模块

基础配置

import logging
# 基本配置
logging.basicConfig(
    level=logging.INFO,  # 日志级别
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',  # 格式
    datefmt='%Y-%m-%d %H:%M:%S'  # 时间格式
)
# 使用不同级别的日志
logging.debug("调试信息")      # 调试
logging.info("普通信息")        # 信息
logging.warning("警告信息")     # 警告
logging.error("错误信息")       # 错误
logging.critical("严重错误")    # 严重错误

输出到文件

import logging
# 配置日志输出到文件
logging.basicConfig(
    level=logging.DEBUG,
    format='%(asctime)s - %(levelname)s - %(message)s',
    filename='app.log',      # 输出到文件
    filemode='a'            # a=追加, w=覆盖
)
logging.info("这条信息会写入文件")

同时输出到文件和控制台

import logging
# 创建logger
logger = logging.getLogger('my_app')
logger.setLevel(logging.DEBUG)
# 文件处理器
file_handler = logging.FileHandler('app.log')
file_handler.setLevel(logging.DEBUG)
# 控制台处理器
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)
# 设置格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)
console_handler.setFormatter(formatter)
# 添加处理器
logger.addHandler(file_handler)
logger.addHandler(console_handler)
# 使用
logger.info("同时输出到文件和控制台")
logger.debug("这条只写入文件")

实际案例:模拟用户登录系统

import logging
import time
from datetime import datetime
class UserLoginSystem:
    def __init__(self):
        # 配置日志
        self.setup_logging()
        self.users = {'admin': '123456', 'user1': 'password'}
        self.logger = logging.getLogger('LoginSystem')
    def setup_logging(self):
        """配置日志系统"""
        # 创建日志器
        logger = logging.getLogger('LoginSystem')
        logger.setLevel(logging.DEBUG)
        # 文件处理器
        file_handler = logging.FileHandler(f'login_{datetime.now().strftime("%Y%m%d")}.log')
        file_handler.setLevel(logging.DEBUG)
        # 控制台处理器
        console_handler = logging.StreamHandler()
        console_handler.setLevel(logging.INFO)
        # 定义格式
        formatter = logging.Formatter(
            '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
        )
        file_handler.setFormatter(formatter)
        console_handler.setFormatter(formatter)
        # 避免重复添加处理器
        if not logger.handlers:
            logger.addHandler(file_handler)
            logger.addHandler(console_handler)
    def login(self, username, password):
        """用户登录功能"""
        self.logger.info(f"用户 {username} 尝试登录")
        if username not in self.users:
            self.logger.warning(f"用户 {username} 不存在")
            return False
        if self.users[username] == password:
            self.logger.info(f"用户 {username} 登录成功")
            return True
        else:
            self.logger.error(f"用户 {username} 密码错误")
            return False
# 使用示例
def main():
    system = UserLoginSystem()
    # 模拟登录尝试
    test_cases = [
        ('admin', '123456'),    # 成功
        ('admin', 'wrong'),     # 密码错误
        ('unknown', '123'),     # 用户不存在
        ('user1', 'password'),  # 成功
    ]
    for username, password in test_cases:
        print(f"\n用户 {username} 尝试登录...")
        result = system.login(username, password)
        print(f"登录结果: {'成功' if result else '失败'}")
        time.sleep(1)  # 模拟延迟
if __name__ == "__main__":
    main()

自定义日志类

import logging
from logging.handlers import RotatingFileHandler
import os
class LogManager:
    def __init__(self, app_name="MyApp", log_dir="logs"):
        self.app_name = app_name
        self.log_dir = log_dir
        # 创建日志目录
        if not os.path.exists(log_dir):
            os.makedirs(log_dir)
        # 创建日志器
        self.logger = logging.getLogger(app_name)
        self.logger.setLevel(logging.DEBUG)
        # 配置文件轮转(文件大小限制)
        log_file = os.path.join(log_dir, f"{app_name}.log")
        file_handler = RotatingFileHandler(
            log_file,
            maxBytes=1024*1024,  # 1MB
            backupCount=5        # 保留5个备份
        )
        # 控制台处理器
        console_handler = logging.StreamHandler()
        # 设置格式
        formatter = logging.Formatter(
            '%(asctime)s - %(name)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s'
        )
        file_handler.setFormatter(formatter)
        console_handler.setFormatter(formatter)
        # 添加处理器
        self.logger.addHandler(file_handler)
        self.logger.addHandler(console_handler)
    def get_logger(self):
        return self.logger
# 使用
log_manager = LogManager()
logger = log_manager.get_logger()
logger.info("系统启动")
logger.error("发生错误")

日志级别控制

import logging
# 日志级别从低到高
logging.DEBUG     # 10 - 调试信息
logging.INFO      # 20 - 普通信息
logging.WARNING   # 30 - 警告信息
logging.ERROR     # 40 - 错误信息
logging.CRITICAL  # 50 - 严重错误
# 设置级别可以控制显示哪些日志
logging.basicConfig(level=logging.WARNING)
logging.debug("这条不会显示")    # 不显示
logging.info("这条不会显示")     # 不显示
logging.warning("这条会显示")    # 显示
logging.error("这条会显示")      # 显示

最佳实践建议

  1. 开发环境:使用DEBUG级别,控制台输出
  2. 测试环境:使用INFO级别,文件输出
  3. 生产环境:使用WARNING级别,文件输出,配合日志轮转
import logging
import os
# 根据环境配置日志
ENV = os.getenv('APP_ENV', 'development')
log_config = {
    'development': {
        'level': logging.DEBUG,
        'handlers': ['console', 'file']
    },
    'testing': {
        'level': logging.INFO,
        'handlers': ['file']
    },
    'production': {
        'level': logging.WARNING,
        'handlers': ['file']
    }
}
# 根据环境配置
config = log_config.get(ENV, log_config['development'])

这样你就可以根据不同的环境和需求,灵活地输出和管理日志了!

抱歉,评论功能暂时关闭!