# loguru-日志开箱即用
# 参考
# 简介
loguru极大程度上简化了logger的配置(开箱即用),默认输出内容就带有时间、级别、模块名、行号、日志信息,并且自带彩色,使用起来更加方便快捷。
from loguru import logger
logger.debug('this is a debug message')
logger.info('this is another debug message')
logger.warning('this is another debug message')
logger.error('this is another debug message')
logger.info('this is another debug message')
logger.success('this is success message!')
logger.critical('this is critical message!')
# Loguru配置
# 添加输出方向
logger.add(sys.stderr, format="{time} {level} {message}", filter="my_module", level="INFO")
# 添加输出到文件
logger.add("my_log.log")
# 添加输出到邮件
import notifiers
params = {
"username": "you@gmail.com",
"password": "abc123",
"to": "dest@gmail.com"
}
from notifiers.logging import NotificationHandler
handler = NotificationHandler("gmail", defaults=params)
logger.add(handler, level="ERROR")
# 向指定地址发
handler = logging.handlers.SysLogHandler(address=('localhost', 514))
logger.add(handler)
# 移除所有输出
logger.remove(handler_id=None) # 或 logger.remove()
# 移除指定输出
trace = logger.add('runtime.log')
logger.remove(trace)
# 滚动日志和压缩
# 文件切割/划分
# rotation检查记录每个消息之前完成。如果已经存在与要创建的文件同名的文件,则通过将日期附加到其基名中来重命名现有文件,以防止文件被覆盖
logger.add("file_1.log", rotation="500 MB") # Automatically rotate too big file
logger.add("file_2.log", rotation="12:00") # New file is created each day at noon
logger.add("file_3.log", rotation="1 week") # Once the file is too old, it's rotated
logger.add("file_1.log", rotation="1 MB") # 滚动大日志文件
# 文件压缩
# 日志压缩方式
logger.add("file_Y.log", compression="zip") # 压缩日志
# 文件超时删除
# 保留文件最大保留期限
logger.add("file_X.log", retention="10 days") # 自动清除
# 其他配置
logger.add("runtime_{time}.log") # 会自动解析时间填进去 runtime__2022-09-30_19-59-07_137961.log
# 自定义颜色
logger.add(sys.stdout, colorize=True, format="<green>{time}</green> <level>{message}</level>")
# 自定义log等级
new_level = logger.level("SNAKY", no=38, color="<yellow>", icon="🐍")
logger.log("SNAKY", "Here we go!")
# 显示堆栈
logger.add("out.log", backtrace=True, diagnose=True) # Caution, may leak sensitive data in prod
# 自定义参数
logger.info("If you're using Python {}, prefer {feature} of course!", 3.6, feature="f-strings")
# 多线程安全
logger.add("somefile.log", enqueue=True)
# 捕捉异常-装饰器
@logger.catch
def my_function(x, y, z):
# An error? It's caught anyway!
return 1 / (x + y + z)
# 捕获异常-详细信息
logger.add("out.log", backtrace=True, diagnose=True) # Caution, may leak sensitive data in prod
def func(a, b):
return a / b
def nested(c):
try:
func(5, c)
except ZeroDivisionError:
logger.exception("What?!")
nested(0)
# 序列化日志信息-每条日志都会被打包成一个json再输出
logger.add(custom_sink_function, serialize=True)
# 脚本化配置
# For scripts
config = {
"handlers": [
{"sink": sys.stdout, "format": "{time} - {message}"},
{"sink": "file.log", "serialize": True},
],
"extra": {"user": "someone"}
}
logger.configure(**config)
# For libraries
logger.disable("my_library")
logger.info("No matter added sinks, this message is not displayed")
logger.enable("my_library")
logger.info("This message however is propagated to the sinks")