本文目录导读:

我来详细介绍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'])
这样你就可以根据不同的环境和需求,灵活地输出和管理日志了!
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播