不想手动再配置logging?那可以试试loguru


不想手动再配置logging?那可以试试loguru文章插图
在部署一些定时运行或者长期运行的任务时 , 为了留存一些导致程序出现异常或错误的信息 , 通常会才用日志的方式来进行记录这些信息 。
在 Python 中用到日志记录 , 那就不可避免地会用到内置的 logging 标准库。 虽然 logging库采用的是模块化设计 , 你可以设置不同的 handler 来进行组合 , 但是在配置上通常较为繁琐;而且如果不是特别处理 , 在一些多线程或多进程的场景下使用 logging 还会导致日志记录会出现错乱或是丢失的情况 。
但有这么一个库 , 它不仅能够减少繁琐的配置过程还能实现和 logging 类似的功能 , 同时还能保证日志记录的线程进程安全 , 又能够和 logging 相兼容 , 并进一步追踪异常也能进行代码回溯 。 这个库叫 loguru——一个专为像我这样懒人而生日志记录库 。
loguru 库的使用可以说是十分简单 , 我们直接可以通过导入它本身封装好的 logger 类就可以直接进行调用 。
#!pip install logurufrom loguru import loggerlogger 本身就是一个已经实例化好的对象 , 如果没有特殊的配置需求 , 那么自身就已经带有通用的配置参数;同时它的用法和 logging 库输出日志时的用法一致
In [1]: from loguru import logger...:...: logger.debug("debug message")...: logger.info("info level message")...: logger.warning("warning level message")...: logger.critical("critical level message")2020-10-07 14:23:09.637 | DEBUG| __main__::3 - debug message2020-10-07 14:23:09.637 | INFO| __main__::4 - info level message2020-10-07 14:23:09.638 | WARNING| __main__::5 - warning level message2020-10-07 14:23:09.638 | CRITICAL | __main__::6 - critical level message当你在 IDE 或终端里运行时会发现 , loguru 还为输出的日志信息带上了不同的颜色样式(schema) , 使得结果更加美观 。
不想手动再配置logging?那可以试试loguru文章插图
01-结果样式
【不想手动再配置logging?那可以试试loguru】当然 , loguru 也像 logging 一样为我们提供了其他可配置的部分 , 但相比于 logging 每次要导入特定的handler再设定一些formatter来说是更为「傻瓜化」了 。
配置使用基本的 add() 方法就可以对 logger 进行简单的配置 , 这些配置有点类似于使用 logging 时的 handler 。 这里简单提及一下比较常用的几个 。
1、写入日志在不指定任何参数时 , logger 默认采用 sys.stderr 标准错误输出将日志输出到控制台(console)中;但在 linux 服务器上我们有时不仅让其输出 , 还要以文件的形式进行留存 , 那么只需要在第一个参数中传入一个你想要留存文件的路径字符串即可 。 就像这样:
from loguru import loggerimport oslogger.add(os.path.expanduser("~/Desktop/testlog.log"))logger.info("hello, world!")这样在你的桌面上就会直接出现相应的 testlog.log 日志文件了 。
但是如果你没有自己要是用 logging 没有预先封装来操作 , 那估计你得写成这样:
import loggingimport osimport sysfrom logging import handlerslog = logging.getLogger(__name__)log.setLevel(logging.DEBUG)fmt = logging.Formatter("%(asctime)s | %(levelname)s | %(message)s")LOGFILE = os.path.expanduser("~/Desktop/testlog.log")console_handler = logging.StreamHandler(sys.stderr)console_handler.setFormatter(fmt)log.addHandler(console_handler)file_handler = handlers.RotatingFileHandler(LOGFILE)file_handler.setFormatter(fmt)log.addHandler(file_handler)log.info("hello, world")2、日志留存、压缩与清理通常来说如果程序或服务的量级较大 , 那么就可以通过集成的日志平台或数据库来对日志信息进行存储和留存 , 后续有需要的话也方便进行日志分析 。
但对我们个人或者一些中小型项目来说 , 通常只需要以文件的形式留存输出的日志即可 。
尽管我们需要将日志写入到相应的文件中 , 如果是少量的日志那还好 , 但是如果是日志输出或记录时间较长的情况 , 那么单个日志文件就十分之大 , 倘若仍然是将日志都写入到一个文件中 , 那么当日志中的内容增长到一定数量时我们想要读取并查找相应的部分时就十分困难 。 这时候我们就需要对日志文件进行留存、压缩 , 甚至在必要时及时进行清理 。
基于以上 , 我们可以通过对 rotation 、compression 和 retention 三个参数进行设定来满足我们的需要:
rotation 参数能够帮助我们将日志记录以大小、时间等方式进行分割或划分:
import osfrom loguru import loggerLOG_DIR = os.path.expanduser("~/Desktop/logs")LOG_FILE = os.path.join(LOG_DIR, "file_{time}.log")if os.path.exits(LOG_DIR):os.mkdir(LOG_DIR)logger.add(LOG_FILE, rotation = "200KB")for n in range(10000):logger.info(f"test - {n}")