国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Python--Redis實戰:第五章:使用Redis構建支持程序:第1節:使用Redis來記錄日志

mdluo / 1522人閱讀

摘要:包括在內的很多軟件都使用這種方法來記錄日志。在這一節中,我們將介紹如何使用來存儲于時間緊密相關的日志,從而在功能上替代那些需要在短期內被存儲的消息。

上一篇文章:Python--Redis實戰:第四章:數據安全與性能保障:第8節:關于性能方面的注意事項
下一篇文章:Python--Redis實戰:第五章:使用Redis構建支持程序:第2節:計數器和統計數據

在構建應用程序和服務的過程中,對正在運行的系統的相關信息的挖掘能力將變得越來越重要:無論是通過挖掘信息來診斷系統問題,還是發現系統中潛在的問題,甚至是挖掘與用戶有關的信息:這些都需要用到日志。

在Linux和Unix的世界中,有兩種常見的記錄日志的方法。第一種是將日志記錄到文件里面,然后隨著時間流逝不斷地將一個又一個日志添加到文件里面,并在一段時間之后創建新的日志文件。包括Redis在內的很多軟件都使用這種方法來記錄日志。但這種記錄日志的方式有可能會遇上麻煩:因為每個不同的服務器會創建不同的日志,而這些服務輪換日志也各不相同,并且也缺少一種能夠方便地聚合所有日志并對其進行處理的常用方法。

syslog服務是第二種常用的日志記錄方法,這個服務運行在幾乎所有Linux服務器和Unix服務器的514號TCP端口和UDP端口上面。syslog接受其他程序發來的日志信息,并將這些消息路由存儲在硬盤上的各個日志文件里面,除此之外,syslog還復制舊日志的輪換和刪除工作。通過配置,syslog甚至可以將日志消息轉發給其他服務來做進一步的處理。因為指定日志的輪換和刪除工作都交給syslog來完成,所以使用syslog服務比直接將日志寫入文件要方便的多。

替換syslog

無論讀者使用上面列舉的兩種日志方法中的哪一種,都最好考慮把系統目前的syslog守護進程(通常是Rsyslogd)替換成syslog-ng。因為我經過使用并配置Rsyslogd和syslog-ng之后,發現syslog-ng用于管理和組織日志消息的配置語言使用起來更簡單一些。另外,盡管因為時間和篇幅限制,我沒有辦法在書中構建一個處理syslog消息并將消息存儲到Redis里面的服務,但對于那些需要在處理請求時立即執行的操作,以及那些可以在請求處理完畢之后再執行的操作(如日志記錄和更新計數器)來說,這種服務器非常適合用作介于這兩種操作之間的間接層。

syslog的轉發功能可以將不同的日志分別存儲在同一臺服務器的多個文件里面,這對于長時間地記錄日志非常有幫助(記得備份)。在這一節中,我們將介紹如何使用Redis來存儲于時間緊密相關的日志,從而在功能上替代那些需要在短期內被存儲的syslog消息。

首先讓我們來看看,如何記錄連續更新的最新日志消息。

最新日志

在構建一個系統的時候,判斷哪些信息需要被記錄是一件困難的事情:需要記錄用戶的登錄和退出行為嗎?需要記錄用戶修改賬號信息的時間嗎?還是只記錄錯誤和異常就可以了?雖然我沒有辦法替你回答這些問題,但我可以向你提供一種將最新出現的日志消息以列表的形式存儲到Redis里面的方法,這個列表可以幫助及你隨時了解最新出現的日志都是什么樣子的。

下面代碼的log_recent()函數展示了將最新日志記錄到Redis里面的方法:為了維持一個包含最新日志的列表,程序使用lpush命令將日志消息推入一個列表里面。之后,如果我們想要查看已有日志消息的話,那么可以使用lrange命令來取出列表中的消息。除了lpush之外,函數還加入了一些額外的代碼,用于命名不同的日志消息隊列,并根據文意的嚴重性對日志進行分級,如果你覺得自己并不需要這些附加功能的話,也可以將相關代碼刪除掉,只保留基本的日志添加功能。

#設置一個字典,將大部分日志的安全級別映射為字符串
import logging
import time

SEVERITY={
    logging.DEBUG:"debug",
    logging.INFO:"info",
    logging.WARNING:"warning",
    logging.ERROR:"debug",
    logging.CRITICAL:"critical",
}
SEVERITY.update((name,name) for name in SEVERITY.values())

def log_recent(conn,name,message,severity=logging.INFO,pipe=None):
    #嘗試將日志的安全級別準還為簡單的字符串
    severity=str(SEVERITY.get(severity,severity)).lower()
    #創建負責存儲消息的鍵
    destination="recent:%s:%s"%(name,severity)
    #將當前時間添加到消息里面,用于記錄消息的發送時間
    message=time.asctime()+"  "+message
    #使用流水線來將通信往返次數降低為一次
    pipe=pipe or conn.pipeline()
    #將消息添加到日志列表的最前面
    pipe.lpush(destination,message)
    #對日志列表進行修建,讓它只包含最新的100條消息
    pipe.ltrim(destination,0,99)
    #執行兩個命令
    pipe.execute()

除了那些將日志的安全級別轉換為字符串(如info和debug)的代碼之外,log_recent()函數的定義非常簡單:基本上就是一個lpush加上一個ltrim。現在你已經知道怎樣記錄最新出現的日志了,是時候來了解一下該如何記錄最常出現(也是最重要的)日志消息了。

常見日志

如果實際運行一下log_recent()函數的話,你就會發現,盡管log_recent()函數非常適用于記錄當前發生的事情,但它并不擅長告訴你哪些消息時重要的,哪些消息是不重要的。為了解決這個問題,我們可以讓程序記錄特定消息出現的頻率,并根據出現頻率的高低來決定消息的排列順序,從而幫助我們找出最重要的消息。

下面代碼的log_comon()函數展示了記錄并輪詢最常見日志消息的方法:程序會將消息作為成員存儲的有序集合里面,并將消息出現的頻率設置為成員的分值。為了確保我們看見的常見消息都是最新的,程序會以每小時一次的頻率對消息進行輪換,并在輪換日志的時候保留上一個小時記錄的常見消息,從而防止沒有任何消息存在的情況出現。

import logging
import time
from datetime import datetime

import redis

SEVERITY={
    logging.DEBUG:"debug",
    logging.INFO:"info",
    logging.WARNING:"warning",
    logging.ERROR:"debug",
    logging.CRITICAL:"critical",
}
SEVERITY.update((name,name) for name in SEVERITY.values())

def log_recent(conn,name,message,severity=logging.INFO,pipe=None):
    #嘗試將日志的安全級別準還為簡單的字符串
    severity=str(SEVERITY.get(severity,severity)).lower()
    #創建負責存儲消息的鍵
    destination="recent:%s:%s"%(name,severity)
    #將當前時間添加到消息里面,用于記錄消息的發送時間
    message=time.asctime()+"  "+message
    #使用流水線來將通信往返次數降低為一次
    pipe=pipe or conn.pipeline()
    #將消息添加到日志列表的最前面
    pipe.lpush(destination,message)
    #對日志列表進行修建,讓它只包含最新的100條消息
    pipe.ltrim(destination,0,99)
    #執行兩個命令
    pipe.execute()

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()

因為記錄常見日志的函數需要小心地處理上一小時收集的日志,所以它比記錄最新日志的函數要復雜的多:程序會在一個watch/multi/exec事務里面,對記錄了上一小時的常見日志的有序集合進行改名,并對記錄了當前所處小時數的鍵進行更新。除此之外,程序還會降流水線對象傳遞給log_recent()函數,以此來減少記錄常見日志和記錄最新日志時,客戶端與Redis服務器之間的通信往返次數。

通過最新日志和常見日志,我們現在已經知道怎樣將系統的運行信息存儲到Redis里面了,那么還有什么其他信息是適合存儲在Redis里面的呢?

上一篇文章:Python--Redis實戰:第四章:數據安全與性能保障:第8節:關于性能方面的注意事項
下一篇文章:Python--Redis實戰:第五章:使用Redis構建支持程序:第2節:計數器和統計數據

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/42703.html

相關文章

  • Python--Redis實戰五章使用Redis構建支持程序3:查找IP所屬城市以及國家

    摘要:下面清單展示了地址所屬地查找程序的具體實現方法將地址轉換為分值以便執行命令查找唯一城市方法用來根據指定的分隔符將字符串進行分割。 上一篇文章:Python--Redis實戰:第五章:使用Redis構建支持程序:第2節:計數器和統計數據下一篇文章:Python--Redis實戰:第五章:使用Redis構建支持程序:第4節:服務的發現與配置 通過將統計數據和日志存儲到Redis里面,我們...

    fengxiuping 評論0 收藏0
  • Python--Redis實戰五章使用Redis構建支持程序2:計數器和統計數據

    摘要:清理程序通過對記錄已知計數器的有序集合執行命令來一個接一個的遍歷所有已知的計數器。 上一篇文章:Python--Redis實戰:第五章:使用Redis構建支持程序:第1節:使用Redis來記錄日志下一篇文章:Python--Redis實戰:第五章:使用Redis構建支持程序:第3節:查找IP所屬城市以及國家 正如第三章所述,通過記錄各個頁面的被訪問次數,我們可以根據基本的訪問計數信息...

    sourcenode 評論0 收藏0

發表評論

0條評論

mdluo

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<