在上一篇中解决了系统的性能问题,但写log又引入了问题,多进程写log会引起混乱。
查询了多进程写log 的方案, 主要有2种:
- 利用多进程的Queue,把log放到统一的有个log queue里面,一个单独的线程写log
- 起一个单独的socket server,由 这个server来接受log,并负责写log
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就会rotate, 最多保留5个文件
formatter = logging.Formatter('%(asctime)s [%(processName)s %(threadName)s %(levelname)s %(module)s:%(lineno)d] %(message)s') 设置log输出的格式, 包括时间,进程名,线程名,模块名字,代码行数
log.setLevel(20) 设置什么级别的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

本文探讨了解决多进程写log导致混乱的方法,提出了利用Queue、socketserver等方案,并介绍了开源项目ConcurrentLogHandler,提供了按文件大小和时间rotate的日志处理方式。通过实例展示了如何实现每个进程独立写log,以及输出log的样式和级别设置。
497

被折叠的 条评论
为什么被折叠?



