标签:
如果你已经运行了log_recent(),你可能会发现,尽管它在获取系统当前发生了什么事情方面非常有用,但它不含告诉你是否错过了一些重要的信息,通过记录一些特定信息的出现频率,你就能够依据这个频率去决定哪些是重要的。
去发现一个信息的出现频率,一个简单却有效的方式是将这个信息做为一个成员存储到ZSET里,比分(score)就是它出现的频率,为了确保我们只看到最近的常用信息,我们每小时会调整(rotate 翻转)一次记录,所以我们不会错过任何消息,我们将保持前一小时有价值的消息。以下就是代码实现
#代码来源:https://github.com/huangz1990/riacn-code/blob/master/ch05_listing_source.py#L54
def log_common(conn, name, message, severity=logging.INFO, timeout=5): # 设置日志的级别。 severity = str(SEVERITY.get(severity, severity)).lower() # 负责存储最新日志的键。 destination = ‘common:%s:%s‘%(name, severity) # 因为程序每小时需要轮换一次日志,所以它使用一个键来记录当前所处的小时数。 start_key = destination + ‘:start‘ pipe = conn.pipeline() end = time.time() + timeout while time.time() < end: try: # 对记录当前小时数的键进行监视,确保轮换操作可以正确地执行。 pipe.watch(start_key) # 取得当前时间。 now = datetime.utcnow().timetuple() # 取得当前所处的小时数。 hour_start = datetime(*now[:4]).isoformat() existing = pipe.get(start_key) # 创建一个事务。 pipe.multi() # 如果目前的常见日志列表是上一个小时的…… if existing and existing < hour_start: #此处在python3里需要改成existing.decode() < hour_start # ……那么将旧的常见日志信息进行归档。 pipe.rename(destination, destination + ‘:last‘) pipe.rename(start_key, destination + ‘:pstart‘) # 更新当前所处的小时数。 pipe.set(start_key, hour_start) # 对记录日志出现次数的计数器执行自增操作。 pipe.zincrby(destination, message) # log_recent()函数负责记录日志并调用execute()函数。 log_recent(pipe, name, message, severity, pipe) return except redis.exceptions.WatchError: # 如果程序因为其他客户端在执行归档操作而出现监视错误,那么重试。 continue
<Redis In Action> 5.1.2 Common logs
标签:
原文地址:http://www.cnblogs.com/hjyang2012/p/5464617.html