本文目录导读:

我来详细介绍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("这条会显示") # 显示
最佳实践建议
- 开发环境:使用DEBUG级别,控制台输出
- 测试环境:使用INFO级别,文件输出
- 生产环境:使用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'])
这样你就可以根据不同的环境和需求,灵活地输出和管理日志了!