当前位置: 首页 > news >正文

loguru logger使用

一、基本使用

①标准使用

from loguru import logger# 在标准输出里面输出一行debug日志
logger.debug("That's dubug")

②设置输出格式

from loguru import loggerlogger.remove(0)  # 先删除格式
logger.add(sink='./logger.log', format="{time: %Y-%m-%d %H:%M:%S} | {level} | {message}")  # sink是log存放路径   {time}:时间戳    {level}:日志级   {message}:日志消息logger.debug("That's dubug")

③日志输出文档完整配置

logger.add(sink="./logs/log.log",   # sink:为记录器生成的每条记录指定目的地。默认情况下,它设置为 sys.stderrlevel="INFO",     # 日志级别filter="my_module",   # 过滤条件format="{time: %Y-%m-%d %H:%M:%S} | {level} | {message}",  # 自定义输出格式enqueue=True,     # enqueue:启用此选项会将日志记录放入队列中,以避免多个进程记录到同一目的地时发生冲突rotation="4 weeks",     # 每4周生成一个日志文件retention="4 months",   # 日志文件保留四个月encoding="utf-8",backtrace=True,   # acktrace:确定异常跟踪是否应该延伸到捕获错误的点之外,以便于调试diagnose=True,   # diagnose:确定变量值是否应显示在异常跟踪中。您应该在生产环境中将其设置为 False 以避免泄露敏感信息compression="zip",   # 设置压缩格式serialize=True,    # serialize:如果设置为 True,则日志记录以 JSON 格式呈现
)

④日志分级别输出到不同的文件

logger.add("debug.log", level="DEBUG", filter=lambda record: record["level"].name == "DEBUG")
logger.add("info.log", level="INFO", filter=lambda record: record["level"].name == "INFO")
logger.add("warning.log", level="WARNING", filter=lambda record: record["level"].name == "WARNING")
logger.add("error.log", level="ERROR", filter=lambda record: record["level"].name == "ERROR")
logger.add("critical.log", level="CRITICAL", filter=lambda record: record["level"].name == "CRITICAL")

⑤多线程与多进程

from atexit import register
from loguru import logger
from threading import Thread
from multiprocessing import Processdef thread_1():for i in range(10):logger.info('线程1')
def thread_2():for i in range(10):logger.debug('线程2')def process_1():logger.add(sink='./file/log/logger_多进程.txt')for i in range(10):logger.info('进程1')def process_2():logger.add(sink='./file/log/logger_多进程.txt')for i in range(10):logger.debug('进程2')"""
这个函数(装饰器的方式)会在python解释器中注册一个退出函数,也就是说,他会在脚本退出之前请求调用这个特殊函数
"""
@register
def over():logger.info('退出程序')if __name__ == '__main__':# 多线程---主线程有一个add函数即可logger.add(sink='./file/log/logger_多线程.txt')t1 = Thread(target=thread_1)t2 = Thread(target=thread_2)t1.start()t2.start()t1.join()t2.join()# # 多进程---需要在各自的进程中有add函数# logger.add(sink='./file/log/logger_多进程.txt', enqueue=True)# p1 = Process(target=process_1)# p2 = Process(target=process_2)## p1.start()# p2.start()# p1.join()# p2.join()# 进程池---也是一样的效果# import multiprocessing# pool = multiprocessing.Pool(processes=2)# pool.apply_async(process_1)# pool.apply_async(process_2)# pool.close()# pool.join()

参考:
https://www.cnblogs.com/CheeseZH/p/11992155.html
https://blog.csdn.net/bailang_zhizun/article/details/107863671
https://blog.csdn.net/lly1122334/article/details/107516039

http://www.lryc.cn/news/164769.html

相关文章:

  • vue-自适应布局-postcss-pxtorem
  • 9.12|day 5|day 44 |完全背包| 518. 零钱兑换 II | 377. 组合总和 Ⅳ
  • C++ 中的原子变量(std::atomic)使用指南
  • 【用unity实现100个游戏之9】使用Unity制作类八方旅人、饥荒风格的俯视角2.5D游戏
  • 如何在群晖中,正确配置 docker 的 ipv6 地址
  • XSS入门 XSS Challenges
  • 李沐《动手学深度学习》torch.cat() 和 torch.stack()的区别及思考
  • 【算法与数据结构】235、LeetCode二叉搜索树的最近公共祖先
  • bboss 流批一体化框架 与 数据采集 ETL
  • JVM详细教程
  • Smartbi吴华夫:后疫情时代,BI发展趋势的观察与应对
  • 软件设计模式系列之三———工厂方法模式
  • pytorch 多卡分布式训练 调用all_gather_object 出现阻塞等待死锁的问题
  • SpringMvc增删改查
  • 【计算机网络】网络编程接口 Socket API 解读(5)
  • 手动实现一个bind函数!
  • 数据结构-时间复杂度/空间复杂度
  • 英语写作中“展示”、“表明”demonstrate、show、indicate、illustrate的用法
  • Redis的java客户端
  • Android环境配置笔记
  • element-table 行的拖拽更改顺序(无需下载sortableJs
  • Docker部署jenkins
  • 从0到1学会Git(第三部分):Git的远程仓库链接与操作
  • 虚拟机Ubuntu操作系统常用终端命令(1)(详细解释+详细演示)
  • redis实战-redis实现异步秒杀优化
  • Python爬虫-IP隐藏技术与代理爬取
  • 二刷力扣--链表
  • 返回值加const ,为了不拷贝得到成员的值,但被赋值的左值也要const
  • 本地如何使用HTTPS进行调试
  • 观察者模式:对象之间的订阅机制