码迷,mamicode.com
首页 > 其他好文 > 详细

<Redis In Action> 5.1.2 Common logs

时间:2016-05-07 12:56:38      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:

文章来源:https://redislabs.com/ebook/redis-in-action/part-2-core-concepts-2/chapter-5-using-redis-for-application-support/5-1-logging-to-redis/5-1-2-common-logs

 

如果你已经运行了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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!