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

資訊專欄INFORMATION COLUMN

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

mdluo / 1548人閱讀

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

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

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

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

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

替換syslog

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

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

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

最新日志

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

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

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

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

常見(jiàn)日志

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

下面代碼的log_comon()函數(shù)展示了記錄并輪詢最常見(jiàn)日志消息的方法:程序會(huì)將消息作為成員存儲(chǔ)的有序集合里面,并將消息出現(xiàn)的頻率設(shè)置為成員的分值。為了確保我們看見(jiàn)的常見(jiàn)消息都是最新的,程序會(huì)以每小時(shí)一次的頻率對(duì)消息進(jìn)行輪換,并在輪換日志的時(shí)候保留上一個(gè)小時(shí)記錄的常見(jiàn)消息,從而防止沒(méi)有任何消息存在的情況出現(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):
    #嘗試將日志的安全級(jí)別準(zhǔn)還為簡(jiǎn)單的字符串
    severity=str(SEVERITY.get(severity,severity)).lower()
    #創(chuàng)建負(fù)責(zé)存儲(chǔ)消息的鍵
    destination="recent:%s:%s"%(name,severity)
    #將當(dāng)前時(shí)間添加到消息里面,用于記錄消息的發(fā)送時(shí)間
    message=time.asctime()+"  "+message
    #使用流水線來(lái)將通信往返次數(shù)降低為一次
    pipe=pipe or conn.pipeline()
    #將消息添加到日志列表的最前面
    pipe.lpush(destination,message)
    #對(duì)日志列表進(jìn)行修建,讓它只包含最新的100條消息
    pipe.ltrim(destination,0,99)
    #執(zhí)行兩個(gè)命令
    pipe.execute()

def log_common(conn,name,message,severity=logging.INFO,timeout=5):
    # 嘗試將日志的安全級(jí)別準(zhǔn)還為簡(jiǎn)單的字符串
    severity = str(SEVERITY.get(severity, severity)).lower()
    #負(fù)責(zé)存儲(chǔ)近期的常見(jiàn)日志消息的鍵
    destination = "common:%s:%s" % (name, severity)
    #因?yàn)槌绦蛎啃r(shí)需要輪換一次日志,所以它使用一個(gè)鍵來(lái)記錄當(dāng)前所處的小時(shí)數(shù)
    start_key=destination+":start"
    # 使用流水線來(lái)將通信往返次數(shù)降低為一次
    pipe = conn.pipeline()
    end=time.time()+timeout
    while time.time()

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

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

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

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/42703.html

相關(guān)文章

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

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

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

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

    sourcenode 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<