用python做测试实现高性能测试工具(5)—多进程写log

在上一篇中解决了系统的性能问题,但写log又引入了问题,多进程写log会引起混乱。

  查询了多进程写log 的方案, 主要有2种:

  利用多进程的Queue,把log放到统一的有个log queue里面,一个单独的线程写log

  起一个单独的socket server,由 这个server来接受log,并负责写log

  我觉得这2重方案都太重了,很多写log的地方就需要改动了,希望找到一个方案能直接不改动老代码写log的方式,开始考虑的是每个进程单独写一个log,但这样统计数据有点小不方便。 继续探索到,有个开源的项目(https://launchpad.net/python-concurrent-log-handler),已经实现了多进程写log,但目前只是实现了按文件大小RotatingFileHandler, 按时间rotate 的功能还没实现。不过这个已经足够用了。


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

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-09-20 06:57:46

用python做测试实现高性能测试工具(5)—多进程写log的相关文章

用python做测试实现高性能测试工具(1)—序

做过几年开发或者测试开发的人员,时常会觉得很迷茫,新功能的开发或者老功能的维护,基本是在堆代码了, 做过几年测试的朋友也会有类似的想法.性能调优或者性能测试的确很考验人分析问题.解决问题的能力,知识是否全面.本人也是第一次实现高性能的测试工具, 记录下这次diameter协议测试工具的优化过程,供大家一起学习. 有些内容涉及到具体产品,做了些改动或者单独写了测试代码演示. Python用来开发高性能的测试工具的确有天然的缺陷,性能差还有GIL,无法利用多线程. 但办法总比困难多,那么多大的互联网

用python做测试实现高性能测试工具(2)—优化代码

在上一篇中我们通过换python的解析器来优化性能.但离实际需求还很远. 方案2: 优化代码 工欲善其事,必先利其器.要优化代码,必须先找到代码的瓶颈所在,最土的方法是添加log, 或者print, 调试完成还需要删除,比较麻烦.python里面也提供了很多profile工具:profile, cProfile, hotshot, pystats, 但这些工具提供的结果可读性不是很好,不够直观的一眼就能看到那个函数或者那一行占用时间最多. python line_profiler 提供了这样的功

用python做测试实现高性能测试工具(3)—优化系统架构

在上一篇中对代码进行了优化,离需求进了一步,但还是很大距离,代码进一步优化我也不知道怎么办了,不会高深的算法.只能从改进系统架构考虑. 方案3: 改变系统架构 在开始多进程之前,先简单说明一下python GIL, 之前自己对他也有些误解.因为python GIL的机制存在,同时运行的线程只有一个,但这个线程在不同时刻可以运行在不同的核上,这个调度是由操作系统完成的,如果你写个死循环,开的线程足够多,是可以把整个系统的CPU消耗干净的,此时你在Linux下通过top可以看到,us 占用的CPU不

图解CSS(1)先做一个样式表测试工具

本文配套源码 工具非常简单, 写了 10 行左右的代码; 运行效果图: 代码文件:unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, ComCtrls, OleCtrls, SHDocVw; type TForm1 = class(TForm) Memo1: TMemo; Splitter

Python中的文档测试模块

  这篇文章主要介绍了Python中的文档测试模块,代码基于Python2.x版本,需要的朋友可以参考下 如果你经常阅读Python的官方文档,可以看到很多文档都有示例代码.比如re模块就带了很多示例代码: ? 1 2 3 4 >>> import re >>> m = re.search('(?<=abc)def', 'abcdef') >>> m.group(0) 'def' 可以把这些示例代码在Python的交互式环境下输入并执行,结果与文

做个合格的测试员

  本来想用"优秀",后来想想不过"合格"而已.最近工作与学习的想法,内容比较碎,先记录下来.     由于有写博客的习惯,写了不少关于测试的东西,常常被别人加群或直接加QQ问问题.可能是因为我写了不少东西的缘故吧!大多数提问者会认为我一定水平很高,然后,问我是做什么测试的?用什么工具?我的回答是:主要以功能测试为主,会用到一些辅助的工具,如 fiddler.他们无不大失所望.   关于我的第一份工作的情况,我在<一个测试员的工作与学习>中已经说的比较详

hibernate-用ssh写的java后台,在本机上做了下并发测试,才100用户并发mysql就开始报异常了,怎么解决

问题描述 用ssh写的java后台,在本机上做了下并发测试,才100用户并发mysql就开始报异常了,怎么解决 org.hibernate.exception.JDBCConnectionException: Cannot open connection at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:97) at org.hibernate.exception.JDBCExceptionHe

如何指向ip-你好,做了一个本地测试的网站,如何指向IP

问题描述 你好,做了一个本地测试的网站,如何指向IP 你好,做了一个本地测试的网站,如何指向IP你好,做了一个本地测试的网站,如何指向IP你好,做了一个本地测试的网站,如何指向IP 解决方案 你好,你有公网ip么?并且你的80端口不能被屏蔽.现在很少有宽带符合这个条件.所以最好租用一个vps或者空间.

【转】Orion - oracle提供的测试io性能的工具

Orion是oracle提供的测试io性能的工具.它可以用来模拟Oracle数据库IO,也可以用来仿 真ASM的条带化的功能. Orion可以支持下列IO负载 1. 小的随机的IO:OLTP的应用主要是随机的读写,大小和数据的块大小一样(一般是8K).这样的应用主要是关注的吞吐量是IOPS和一个请求的平均延时时间.Orion可以仿真一个随机IO负载.指定的读写百分比,指定的IO大小,指定的IOs,IOs是分布在不同的磁盘上. 2. 大的连续的IO:数据仓库的应用,数据装载,备份,和恢复会产生连续