r¶
日志(log)¶
应用
适用于各种单纯记录用途,要求按写入先后排序,但不必严格按时间排序的文本,比如事件日志、服务器日志、博客文章,等等。
See also
如果你需要按时间作参数排序或处理你的条目,可以使用时间线(timeline)。
定义
一个日志对象通常需要写入、读出以及截断操作。
写入操作append
只是单纯将条目追加到日志后面,读出操作read
可以指定一个区间(比如最新100条,最旧200条等),或是用一个迭代器逐条读取。
length
操作查看日志的条目数量。
截断功能keep
接受一个数值,用来保证日志文件不会太大,比如只保留最新100条,只保留最新500条,等等。有时候还需要清空整个日志,所以clear
方法也是有必要的。
条目的位置一般来说是无关紧要的,比如你通常不需要知道第101个条目的内容,所以不需要下标索引类(index)方法。
实现
日志可以用Redis的list_struct来实现,LPUSH或RPUSH实现写入,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)