r

日志(log)

应用

适用于各种单纯记录用途,要求按写入先后排序,但不必严格按时间排序的文本,比如事件日志、服务器日志、博客文章,等等。

See also

如果你需要按时间作参数排序或处理你的条目,可以使用时间线(timeline)

定义

一个日志对象通常需要写入、读出以及截断操作。

写入操作append只是单纯将条目追加到日志后面,读出操作read可以指定一个区间(比如最新100条,最旧200条等),或是用一个迭代器逐条读取。

length操作查看日志的条目数量。

截断功能keep接受一个数值,用来保证日志文件不会太大,比如只保留最新100条,只保留最新500条,等等。有时候还需要清空整个日志,所以clear方法也是有必要的。

条目的位置一般来说是无关紧要的,比如你通常不需要知道第101个条目的内容,所以不需要下标索引类(index)方法。

实现

日志可以用Redis的list_struct来实现,LPUSHRPUSH实现写入,LRANGE实现读出,LTRIM负责截断。

因为list_struct结构的特性,新条目默认总是被追加到末尾(最左边或最右边),所以你不需要向日志提供时间值作参数,尽管时间值常常是日志内容的一部分。

在这个例子中,我们将最新的日志条目追加到列表最左边(使用LPUSH),而旧的日志条目则被“挤”到右边的。

# coding:utf-8

# file: ./r/log/list_implement.py

from redis import Redis

# Redis列表的边界下标
LEFTMOST = 0
RIGHTMOST = -1

class Log:
    
    def __init__(self, name, client=Redis()):
        self.name = name
        self.client = client

    def append(self, content):
        return self.client.lpush(self.name, content)

    def read(self, start=LEFTMOST, stop=RIGHTMOST):
        return self.client.lrange(self.name, start, stop)

    def length(self):
        return self.client.llen(self.name)

    def clear(self):
        # 因为del是Python的保留字
        # 所以redis-py用delete代替del命令
        self.client.delete(self.name)

    def keep(self, size):
        # 只保留log[0:size-1]范围内的条目
        self.client.ltrim(self.name, LEFTMOST, size-1)