成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Python--Redis實戰(zhàn):第五章:使用Redis構(gòu)建支持程序:第1節(jié):使用Redis來記錄日志

mdluo / 1545人閱讀

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

上一篇文章:Python--Redis實戰(zhàn):第四章:數(shù)據(jù)安全與性能保障:第8節(jié):關(guān)于性能方面的注意事項
下一篇文章:Python--Redis實戰(zhàn):第五章:使用Redis構(gòu)建支持程序:第2節(jié):計數(shù)器和統(tǒng)計數(shù)據(jù)

在構(gòu)建應(yīng)用程序和服務(wù)的過程中,對正在運行的系統(tǒng)的相關(guān)信息的挖掘能力將變得越來越重要:無論是通過挖掘信息來診斷系統(tǒng)問題,還是發(fā)現(xiàn)系統(tǒng)中潛在的問題,甚至是挖掘與用戶有關(guān)的信息:這些都需要用到日志。

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

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

替換syslog

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

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

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

最新日志

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

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

#設(shè)置一個字典,將大部分日志的安全級別映射為字符串
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()
    #創(chuàng)建負責存儲消息的鍵
    destination="recent:%s:%s"%(name,severity)
    #將當前時間添加到消息里面,用于記錄消息的發(fā)送時間
    message=time.asctime()+"  "+message
    #使用流水線來將通信往返次數(shù)降低為一次
    pipe=pipe or conn.pipeline()
    #將消息添加到日志列表的最前面
    pipe.lpush(destination,message)
    #對日志列表進行修建,讓它只包含最新的100條消息
    pipe.ltrim(destination,0,99)
    #執(zhí)行兩個命令
    pipe.execute()

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

常見日志

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

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

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()
    #創(chuàng)建負責存儲消息的鍵
    destination="recent:%s:%s"%(name,severity)
    #將當前時間添加到消息里面,用于記錄消息的發(fā)送時間
    message=time.asctime()+"  "+message
    #使用流水線來將通信往返次數(shù)降低為一次
    pipe=pipe or conn.pipeline()
    #將消息添加到日志列表的最前面
    pipe.lpush(destination,message)
    #對日志列表進行修建,讓它只包含最新的100條消息
    pipe.ltrim(destination,0,99)
    #執(zhí)行兩個命令
    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)
    #因為程序每小時需要輪換一次日志,所以它使用一個鍵來記錄當前所處的小時數(shù)
    start_key=destination+":start"
    # 使用流水線來將通信往返次數(shù)降低為一次
    pipe = conn.pipeline()
    end=time.time()+timeout
    while time.time()

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

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

上一篇文章:Python--Redis實戰(zhàn):第四章:數(shù)據(jù)安全與性能保障:第8節(jié):關(guān)于性能方面的注意事項
下一篇文章:Python--Redis實戰(zhàn):第五章:使用Redis構(gòu)建支持程序:第2節(jié):計數(shù)器和統(tǒng)計數(shù)據(jù)

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/42703.html

相關(guān)文章

  • Python--Redis實戰(zhàn)五章使用Redis構(gòu)建支持程序3節(jié):查找IP所屬城市以及國家

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

    fengxiuping 評論0 收藏0
  • Python--Redis實戰(zhàn)五章使用Redis構(gòu)建支持程序2節(jié):計數(shù)器和統(tǒng)計數(shù)據(jù)

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

    sourcenode 評論0 收藏0

發(fā)表評論

0條評論

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