# 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!')

image

# 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")