知识星球:知识星球 | 深度连接铁杆粉丝,运营高品质社群,知识变现的工具知识星球是创作者连接铁杆粉丝,实现知识变现的工具。任何从事创作或艺术的人,例如艺术家、工匠、教师、学术研究、科普等,只要能获得一千位铁杆粉丝,就足够生计无忧,自由创作。社群管理、内容沉淀、链接粉丝等就在知识星球。https://articles.zsxq.com/id_5x1m9wdv3e20.html
Loguru 是一个简单而强大的 Python 日志记录库,它旨在提供一种更简洁、更现代的日志记录方式,相比于标准的 logging
模块,Loguru 允许开发者以最少的代码实现强大的日志功能。以下是 Loguru 的一些基本用法:
-
安装 Loguru: 你可以通过 pip 来安装 Loguru:
pip install loguru
-
基本使用: 导入 Loguru 并使用默认配置记录日志:
from loguru import logger logger.info("Hello, Loguru!")
-
日志输出到文件: 使用
logger.add()
方法将日志输出到文件,并可以设置日志轮转、保留策略等:logger.add("output.log", rotation="500 MB", level="INFO")
-
异常追踪: Loguru 可以捕获和记录异常信息,方便定位问题:
from loguru import logger try: result = 1 / 0 except Exception as e: logger.exception("An error occurred: {e}")
-
消息格式化: Loguru 支持灵活的消息格式化,可以添加自定义信息、时间戳等:
from loguru import logger logger.info("User {user} logged in at {time}", user="Alice", time="2023-01-01 12:00:00")
-
日志旋转: Loguru 支持日志旋转,可以基于文件大小或时间来触发日志旋转:
from loguru import logger logger.add("rotating_log.log", rotation="100 MB", retention="10 days", level="INFO")
-
异步日志记录: Loguru 支持异步日志记录,提高性能:
from loguru import logger logger.add("async_log.log", level="INFO", enqueue=True)
-
自定义处理器: Loguru 允许添加自定义处理器,满足个性化的日志记录需求:
from loguru import logger def custom_handler(record): print(f"Custom Handler: {record['message']}") logger.add(custom_handler, level="INFO")
-
日志级别: Loguru 提供了丰富的日志级别,可以根据需要进行筛选,以便更精确地获取关键信息:
from loguru import logger logger.add("important_logs.log", level="ERROR") logger.debug("This debug message will be ignored") logger.error("This error message will be recorded")
-
自定义输出格式: 通过 Loguru,可以根据项目的需求轻松定义自己的输出格式:
python
from loguru import logger logger.add("custom_format.log", format="<green>{time:YYYY-MM-DD HH:mm:ss}</green> | <level>{message}</level>")
Loguru 的设计理念是尽可能地简单易用,同时提供强大的功能,使其成为 Python 日志记录的优雅之道。更多关于 Loguru 的高级用法和特性,可以参考官方文档或相关教程。
举例.
写入文件
日志一般需要持久化,除了输出到命令行终端外,还需要写入文件。标准日志库可以通过配置文件配置logger,在代码中也可以实现,但过程比较繁琐。loguru相对而已就显得稍微简单一些,我们看下在代码中如何实现此功能。日志代码如下:
import sys
from loguru import logger
logger.configure(handlers=[
{
"sink": sys.stderr,
"format": "{time:YYYY-MM-DD HH:mm:ss.SSS} |<lvl>{level:8}</>| {name} : {module}:{line:4} | <cyan>mymodule</> | - <lvl>{message}</>",
"colorize": True
},
{
"sink": 'first.log',
"format": "{time:YYYY-MM-DD HH:mm:ss.SSS} |{level:8}| {name} : {module}:{line:4} | mymodule | - {message}",
"colorize": False
},
])
logger.debug('this is debug')
logger.info('this is info')
logger.warning('this is warning')
logger.error('this is error')
logger.critical('this is critical')
与3.1 唯一不同的地方,logger.configure新增了一个handler,写入到日志文件中去。用法很简单
3模块名参数化
上述只是通过logger.configure设置日志格式,但是模块名不是可变的,实际项目开发中,不同模块写日志,需要指定不同的模块名称。因此,模块名称需要参数化,这样实用性更强。样例代码如下:
import sys
from loguru import logger
logger.configure(handlers=[
{
"sink": sys.stderr,
"format": "{time:YYYY-MM-DD HH:mm:ss.SSS} |<lvl>{level:8}</>| {name} : {module}:{line:4} | <cyan>{extra[module_name]}</> | - <lvl>{message}</>",
"colorize": True
},
{
"sink": 'first.log',
"format": "{time:YYYY-MM-DD HH:mm:ss.SSS} |{level:8}| {name} : {module}:{line:4} | {extra[module_name]} | - {message}",
"colorize": False
},
])
log = logger.bind(module_name='my-loguru')
log.debug("this is hello, module is my-loguru")
log2 = logger.bind(module_name='my-loguru2')
log2.info("this is hello, module is my-loguru2")
logger.bind(module_name=‘my-loguru’)通过bind方法,实现module_name的参数化。bind返回一个日志对象,可以通过此对象进行日志输出,这样就可以实现不同模块的日志格式。
loguru中自定义模块名称的功能比标准日志库有点不同。通过bind方法,可以轻松实现标准日志logging的功能。而且,可以通过bind和logger.configure,轻松实现结构化日志。