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

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}")最后呈现如下:
不想手动再配置logging?那可以试试loguru文章插图
02-rotation
随着分割文件的数量越来越多之后 , 我们也可以进行压缩对日志进行留存 , 这里就要使用到compression 参数 , 该参数只要你传入通用的压缩文件扩展名即可 , 如 zip、tar、gz等 。
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", compression="zip")for n in range(10000):logger.info(f"test - {n}")从结果可以看到 , 只要是满足了 rotation 分割后的日志文件都被直接压缩成了 zip 文件 , 文件大小由原本的 200kb 直接减少至 10kb , 对于一些磁盘空间吃紧的 Linux 服务器来说是则是很有必要的 。
不想手动再配置logging?那可以试试loguru文章插图
03-compression
当然了 , 如果你不想对日志进行留存 , 或者只想保留一段时间内的日志并对超期的日志进行删除 , 那么直接使用 retention 参数就好了 。
这里我们可以将之前的结果随意复制 N 多份在 logs 文件夹中 , 然后再执行一次加上 retension 参数后代码:
from loguru import loggerLOG_DIR = os.path.expanduser("~/Desktop/logs")LOG_FILE = os.path.join(LOG_DIR, "file_{time}.log")if not os.path.exists(LOG_DIR):os.mkdir(LOG_DIR)logger.add(LOG_FILE, rotation="200KB",retention=1)for n in range(10000):logger.info(f"test - {n}")当然对 retention 传入整数时 , 该参数表示的是所有文件的索引 , 而非要保留的文件数 , 这里是个反直觉的小坑 , 用的时候注意一下就好了 。 所以最后我们会看到只有两个时间最近的日志文件会被保留下来 , 其他都被直接清理掉了 。
不想手动再配置logging?那可以试试loguru文章插图
04-retention
3、序列化如果在实际中你不太喜欢以文件的形式保留日志 , 那么你也可以通过 serialize 参数将其转化成序列化的 json 格式 , 最后将导入类似于 MongoDB、ElasticSearch 这类数 NoSQL 数据库中用作后续的日志分析 。
from loguru import loggerimport oslogger.add(os.path.expanduser("~/Desktop/testlog.log"), serialize=True)logger.info("hello, world!")


推荐阅读