1.loguru 日志
loguru 是一个强大的日志记录库,提供了简洁易用的API,比标准的 logging 模块更友好。它内置了许多高级特性,比如颜色输出、异步支持、日志轮转等。
from loguru import logger
# 简单的日志记录
logger.debug("这是一个调试消息")
logger.info("这是一个信息消息")
logger.warning("这是一个警告消息")
logger.error("这是一个错误消息")
logger.critical("这是一个严重错误消息")
# 日志记录到文件并设置轮转
logger.add("file_{time}.log", rotation="500 MB") # 每500MB创建一个新文件
# 记录带参数的日志
name = "Alice"
age = 30
logger.info("名字: {name}, 年龄: {age}", name=name, age=age)
功能概述
基础日志级别:与 logging 模块类似,loguru 也支持多种日志级别,如 DEBUG, INFO, WARNING, ERROR, 和 CRITICAL。
日志格式:loguru 会自动输出格式化的日志信息,包括时间、级别、消息等,可以自定义格式。
日志轮转:可以轻松设置日志文件的轮转规则,例如基于文件大小、时间或其他条件。
异步支持:loguru 可以异步记录日志,适合在高并发环境中使用。
颜色支持:loguru 在控制台输出时,默认带有颜色标注,便于阅读。
2. 异常
在Python中,异常处理用于捕获和处理在程序执行过程中可能发生的错误,从而避免程序崩溃。异常处理通常使用 try, except, else, 和 finally 语句。
try:
result = 10 / 2
except ZeroDivisionError:
print("不能除以零!")
else:
print(f"计算结果是: {result}")
try:
file = open("somefile.txt", "r")
# 处理文件
except FileNotFoundError:
print("文件未找到!")
finally:
file.close()
print("文件已关闭")
class MyCustomError(Exception):
pass
try:
raise MyCustomError("这是一个自定义错误")
except MyCustomError as e:
print(e)
try:
result = 10 / 0
except Exception as e:
print(f"发生了一个异常: {e}")
小结
try 块:放置可能引发异常的代码。
except 块:处理特定异常。
else 块:在没有异常发生时执行。
finally 块:无论是否发生异常,都会执行的代码。
通过这些工具,你可以编写更加健壮的Python代码,避免因未处理的异常导致程序崩溃。
3.装饰器
Python装饰器是一个非常强大的工具,用于修改或增强函数或方法的行为。装饰器本质上是一个函数,它接收另一个函数作为参数,并返回一个新的函数。装饰器通常用于日志记录、访问控制、缓存、性能测量等场景。
def my_decorator(func):
def wrapper():
print("在函数执行之前做一些事情")
func()
print("在函数执行之后做一些事情")
return wrapper
@my_decorator
def say_hello():
print("Hello!")
say_hello()
def repeat(num_times):
def decorator(func):
def wrapper(*args, **kwargs):
for _ in range(num_times):
func(*args, **kwargs)
return wrapper
return decorator
@repeat(num_times=3)
def greet(name):
print(f"Hello, {name}!")
greet("Alice")
def log(func):
def wrapper(*args, **kwargs):
print(f"调用函数 {func.__name__},参数: {args}, {kwargs}")
result = func(*args, **kwargs)
print(f"函数 {func.__name__} 返回: {result}")
return result
return wrapper
@log
def add(x, y):
return x + y
add(2, 3)
def require_login(func):
def wrapper(user, *args, **kwargs):
if not user.is_authenticated:
raise PermissionError("你必须登录才能访问这个功能")
return func(user, *args, **kwargs)
return wrapper
@require_login
def view_profile(user):
print(f"显示用户 {user.name} 的个人资料")
# 假设有一个用户对象
user = User(name="Alice", is_authenticated=True)
view_profile(user)
装饰器是Python中一种优雅的语法,可以为函数或方法添加额外的行为。通过理解装饰器的结构和应用场景,你可以编写出更加灵活和可重用的代码。
4. 错误追踪
如果你想要获取完整的错误追踪信息,可以使用 traceback 模块:
import traceback
try:
result = 10 / 0
except ZeroDivisionError:
error_message = traceback.format_exc() # 将追踪信息保存为字符串
print(error_message)
# 或将追踪信息写入文件
with open('error.log', 'w') as f:
f.write(error_message)
import sys
import traceback
def custom_traceback():
exc_type, exc_value, exc_traceback = sys.exc_info()
trace = ''.join(traceback.format_exception(exc_type, exc_value, exc_traceback))
return trace
try:
result = 10 / 0
except ZeroDivisionError:
trace_info = custom_traceback()
print(f"自定义追踪信息:\n{trace_info}")
5.完整代码
from loguru import logger
import traceback
logger.add("log.log")
logger.add(sys.stdout, level='INFO', format='{message}')
def printInfo(func):
def log(*args, **kwargs):
try:
return func(*args, **kwargs)
except Exception as e:
logger.info(e)
print ("error: ",e,traceback.format_exc())
logger.info(traceback.format_exc())
return log