python中日志logging模块的性能及多进程详解

 更新时间:2017年07月18日 09:32:18   作者:常城  
使用Python来写后台任务时,时常需要使用输出日志来记录程序运行的状态,并在发生错误时将错误的详细信息保存下来,以别调试和分析。Python的logging模块就是这种情况下的好帮手。本文就介绍了python中日志logging模块性能及多进程的相关资料,需要的朋友可以参考下。

前言

Java 中最通用的日志模块莫过于 Log4j 了,在 python 中,也自带了 logging 模块,该模块的用法其实和 Log4j 类似。日志是记录操作的一种好方式。但是日志,基本都是基于文件的,也就是要写到磁盘上的。这时候,磁盘将会成为一个性能瓶颈。对于普通的服务器硬盘(机械磁盘,非固态硬盘),Python日志的性能瓶颈是多少呢?今天我们就来测一下。下面话不多说,来一起看看详细的介绍:

测试代码如下:

#! /usr/bin/env python 
#coding=utf-8 
 
# ============================ 
# Describe : 给平台提供的日志 
# D&P Author By:  常成功 
# Create Date:  2016/08/01 
# Modify Date:  2016/08/01 
# ============================ 
 
import time 
import os 
import logging 
 
 
print "Start test ...." 
s_tm = time.time() 
test_time = 10.0 # 测试时间10秒 
e_tm = s_tm + 10 
j = 0 
 
pid = str(os.getpid()) 
while 1: 
 now_time = time.time() 
 j += 1 
 if now_time > e_tm: 
  break 
 # 生成文件夹 
 lujing = "d:\\test_log" 
 if not os.path.exists(lujing): 
  os.mkdir(lujing) 
 
 fm2 = '%Y%m%d' 
 YMD = time.strftime(fm2, time.localtime(now_time)) 
 
 filename = 'recharge_' + YMD + '.log' 
 log_file = os.path.join(lujing, filename) 
 t = "\t" 
 log_msg = str(j) +t+ str(now_time) +t+ pid 
 
 the_logger = logging.getLogger('recharge_log') 
 f_handler = logging.FileHandler(log_file) 
 the_logger.addHandler(f_handler) 
 the_logger.setLevel(logging.INFO) 
 # To pass exception information, use the keyword argument exc_info with a true value 
 the_logger.info(log_msg, exc_info=False) 
 the_logger.removeHandler(f_handler) 
 
rps = j/test_time 
print rps, "rows per second" 

结果为:

Start test ....

2973.0 rows per second


Python的logging性能:

7200转的机械磁盘,测了几次,每秒的能写入日志的行数(每行就是一条日志),数量基本在 2800-3000 之间。此时,磁盘IO基本已经跑满。(在3.3Ghz的CPU上,CPU占用大约40%)。

Python的logging多进程:

python 的 logging模块,是线程安全的。但对于多进程的程序来说,怎么去写日志文件呢?我的解决办法是,每个进程的PID,写一个单独的日志文件。再用算法把所有进程的日志合并起来,生成新的日志。

提示:由于磁盘IO已经到达瓶颈,所以多进程并不能提高日志性能。高性能日志,需要用缓存,或者分布式日志。

总结

以上就是这篇文章的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • Python做简单的字符串匹配详解

    Python做简单的字符串匹配详解

    这篇文章主要介绍了Python做简单的字符串匹配详解的相关资料,需要的朋友可以参考下
    2017-03-03
  • Python调用ChatGPT制作基于Tkinter的桌面时钟

    Python调用ChatGPT制作基于Tkinter的桌面时钟

    这篇文章主要为大家详细介绍了Python如何调用ChatGPT制作基于Tkinter的桌面时钟,文中的示例代码讲解详细,感兴趣的可以了解一下
    2023-03-03
  • python中eval函数使用与异常处理详解

    python中eval函数使用与异常处理详解

    这篇文章主要给大家介绍了关于python中eval函数使用与异常处理的相关资料,eval()函数用来执行一个字符串表达式,并返回表达式的值,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-04-04
  • python字符类型的一些方法小结

    python字符类型的一些方法小结

    下面小编就为大家带来一篇python字符类型的一些方法小结。小编觉得挺不错的,现在分享给大家,也给大家做个参考,一起跟随小编过来看看吧
    2016-05-05
  • Python实现四个经典小游戏合集

    Python实现四个经典小游戏合集

    这篇文章主要介绍了利用Python编写一个经典小游戏的合集,包括:贪吃蛇,扫雷,俄罗斯方块,五子棋。感兴趣的小伙伴可以跟随小编一起学习一下
    2021-12-12
  • python实现复制文件到指定目录

    python实现复制文件到指定目录

    这篇文章主要为大家详细介绍了python实现复制文件到指定的目录下,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • django小技巧之html模板中调用对象属性或对象的方法

    django小技巧之html模板中调用对象属性或对象的方法

    这篇文章主要介绍了django的html模板中调用对象属性或对象的方法及相关代码,有需要的小伙伴可以参考下。
    2018-11-11
  • django2笔记之路由path语法的实现

    django2笔记之路由path语法的实现

    这篇文章主要介绍了django2笔记之路由path语法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • python 给图像添加透明度(alpha通道)

    python 给图像添加透明度(alpha通道)

    这篇文章主要介绍了python 给图像添加透明度,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • 浅述python中深浅拷贝原理

    浅述python中深浅拷贝原理

    Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果,其实这个是由于共享内存导致的结果,下面我们来简单谈下Python中的深拷贝和浅拷贝。
    2018-09-09

最新评论