在上一篇中解決了系統(tǒng)的性能問(wèn)題,但寫log又引入了問(wèn)題,多進(jìn)程寫log會(huì)引起混亂。
查詢了多進(jìn)程寫log 的方案, 主要有2種:
利用多進(jìn)程的Queue,把log放到統(tǒng)一的有個(gè)log queue里面,一個(gè)單獨(dú)的線程寫log
起一個(gè)單獨(dú)的socket
server,由 這個(gè)server來(lái)接受log,并負(fù)責(zé)寫log
我覺(jué)得這2重方案都太重了,很多寫log的地方就需要改動(dòng)了,希望找到一個(gè)方案能直接不改動(dòng)老代碼寫log的方式,開始考慮的是每個(gè)進(jìn)程單獨(dú)寫一個(gè)log,但這樣統(tǒng)計(jì)數(shù)據(jù)有點(diǎn)小不方便。 繼續(xù)探索到,有個(gè)開源的項(xiàng)目(https://launchpad.net/python-concurrent-log-handler),已經(jīng)實(shí)現(xiàn)了多進(jìn)程寫log,但目前只是實(shí)現(xiàn)了按文件大小RotatingFileHandler, 按時(shí)間rotate 的功能還沒(méi)實(shí)現(xiàn)。不過(guò)這個(gè)已經(jīng)足夠用了。
try: from cloghandler import ConcurrentRotatingFileHandler as RFHandler except ImportError: from warnings import warn warn("ConcurrentLogHandler package not installed. Using builtin log handler") from logging.handlers import RotatingFileHandler as RFHandler rotateHandler = RFHandler("sim.log", "a", 10*1024*1024, 5) formatter = logging.Formatter('%(asctime)s [%(processName)s %(threadName)s %(levelname)s %(module)s:%(lineno)d] %(message)s') rotateHandler.setFormatter(formatter) log = logging.getLogger() log.addHandler(rotateHandler) log.setLevel(20) rotateHandler = RFHandler("sim.log", "a", 10*1024*1024, 5) |
log文件名為sim.log, 文件到10M就會(huì)rotate, 最多保留5個(gè)文件
formatter = logging.Formatter('%(asctime)s [%(processName)s %(threadName)s %(levelname)s %(module)s:%(lineno)d] %(message)s') 設(shè)置log輸出的格式, 包括時(shí)間,進(jìn)程名,線程名,模塊名字,代碼行數(shù)
log.setLevel(20) 設(shè)置什么級(jí)別的log輸出, CRITICAL 50; ERROR 40; WARNING 30; INFO 20; DEBUG 10, NOSET 0;
import logging import time import multiprocessing class Customer(multiprocessing.Process): def __init__(self,mp_name): multiprocessing.Process.__init__(self,name=mp_name) def run(self): while 1: logging.debug(" I am here") time.sleep(1) for i in xrange(2): mp=Customer("customer"+str(i)) mp.start() |
最后輸出log的例子是:
2013-12-05 21:42:10,961 [customer0 MainThread DEBUG testqueue_old:115] I am here 2013-12-05 21:42:15,361 [customer1 MainThread DEBUG testqueue_old:115] I am here |
相關(guān)
文章: