全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

详解Python中logging日志模块在多进程环境下的使用

前言

相信每位程序员应该都知道,在使用 Python 来写后台任务时,时常需要使用输出日志来记录程序运行的状态,并在发生错误时将错误的详细信息保存下来,以别调试和分析。Python 的 logging 模块就是这种情况下的好帮手。

logging 模块可以指定日志的级别,DEBUG、INFO、WARNING、ERROR、CRITICAL,例如可以在开发和调试时,把 DEBUG 以上级别的日志都输出,而在生产环境下,只输出 INFO 级别。(如果不特别指定,默认级别是 warning)

logging 还可以指定输出到命令行或者文件,还可以按时间或大小分割日志文件。

关于 logging 的详细使用,这里就不再细说,可以参考官方文档,或者这里的介绍。

logging 的配置

通常情况下,我们需要将日志保存到文件中,并期望能自动分割文件,避免日志文件太大。下面给出了一个 logging 的配置例子。

import logging.config
 
logging.config.dictConfig({
 'version': 1,
 'disable_existing_loggers': True,
 'formatters': {
  'verbose': {
   'format': "[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s",
   'datefmt': "%Y-%m-%d %H:%M:%S"
  },
  'simple': {
   'format': '%(levelname)s %(message)s'
  },
 },
 'handlers': {
  'null': {
   'level': 'DEBUG',
   'class': 'logging.NullHandler',
  },
  'console': {
   'level': 'DEBUG',
   'class': 'logging.StreamHandler',
   'formatter': 'verbose'
  },
  'file': {
   'level': 'DEBUG',
   'class': 'logging.RotatingFileHandler',
   # 当达到10MB时分割日志
   'maxBytes': 1024 * 1024 * 10,
   # 最多保留50份文件
   'backupCount': 50,
   # If delay is true,
   # then file opening is deferred until the first call to emit().
   'delay': True,
   'filename': 'logs/mysite.log',
   'formatter': 'verbose'
  }
 },
 'loggers': {
  '': {
   'handlers': ['file'],
   'level': 'info',
  },
 }
})

我们在一个模块内,就可以这么使用来记录日志

import logging
logger = logging.getLogger(__name__)
 
if __name__ == '__main__':
 logger.info('log info')

多进程环境下的使用

按照官方文档的介绍,logging 是线程安全的,也就是说,在一个进程内的多个线程同时往同一个文件写日志是安全的。但是(对,这里有个但是)多个进程往同一个文件写日志不是安全的。官方的说法是这样的:

Because there is no standard way to serialize access to a single file across multiple processes in Python. If you need to log to a single file from multiple processes, one way of doing this is to have all the processes log to a SocketHandler, and have a separate process which implements a socket server which reads from the socket and logs to file. (If you prefer, you can dedicate one thread in one of the existing processes to perform this function.)

有的人会说,那我不用多进程不就可以了。但是 Python 有一个 GIL 的大锁(关于 GIL 的纠葛可以看这里),使用多线程是没法利用到多核 CPU 的,大部分情况下会改用多进程来利用多核 CPU,因此我们还是绕不开不开多进程下日志的问题。

为了解决这个问题,可以使用 ConcurrentLogHandler,ConcurrentLogHandler 可以在多进程环境下安全的将日志写入到同一个文件,并且可以在日志文件达到特定大小时,分割日志文件。在默认的 logging 模块中,有个 TimedRotatingFileHandler 类,可以按时间分割日志文件,可惜 ConcurrentLogHandler 不支持这种按时间分割日志文件的方式。

重新修改下 handlers 中的 class。

logging.config.dictConfig({
 ...
 'handlers': {
  'file': {
   'level': 'DEBUG',
   # 如果没有使用并发的日志处理类,在多实例的情况下日志会出现缺失
   'class': 'cloghandler.ConcurrentRotatingFileHandler',
   # 当达到10MB时分割日志
   'maxBytes': 1024 * 1024 * 10,
   # 最多保留50份文件
   'backupCount': 50,
   # If delay is true,
   # then file opening is deferred until the first call to emit().
   'delay': True,
   'filename': 'logs/mysite.log',
   'formatter': 'verbose'
  }
 },
 ...
})

运行后可以发现,会自动创建一个.lock文件,通过锁的方式来安全的写日志文件。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家学习或者使用python能带来一定的帮助,如果有疑问大家可以留言交流。


# python  # logging多进程  # logging模块  # 多进程  # 日志  # Python使用logging实现多进程安全的日志模块  # python logging多进程多线程输出到同一个日志文件的实战案例  # python 实现多进程日志轮转ConcurrentLogHandler  # python多进程下实现日志记录按时间分割  # python logging日志模块以及多进程日志详解  # python中日志logging模块的性能及多进程详解  # python多进程日志以及分布式日志的实现方式  # 多核  # 情况下  # 有个  # 还可以  # 多个  # 最多  # 不开  # 法利  # 文档  # 出了  # 是这样  # 而在  # 并在  # 太大  # 那我  # 不就  # 如果没有  # 会说  # 不支持  # 可以使用 


相关文章: 长沙企业网站制作哪家好,长沙水业集团官方网站?  济南网站制作的价格,历城一职专官方网站?  C++用Dijkstra(迪杰斯特拉)算法求最短路径  如何通过VPS搭建网站快速盈利?  如何通过云梦建站系统实现SEO快速优化?  c++ stringstream用法详解_c++字符串与数字转换利器  C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  魔毅自助建站系统:模板定制与SEO优化一键生成指南  如何选择最佳自助建站系统?快速指南解析优劣  整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?  香港服务器网站卡顿?如何解决网络延迟与负载问题?  网站制作企业,网站的banner和导航栏是指什么?  武清网站制作公司,天津武清个人营业执照注销查询系统网站?  北京网站制作的公司有哪些,北京白云观官方网站?  如何在IIS7中新建站点?详细步骤解析  javascript中对象的定义、使用以及对象和原型链操作小结  保定网站制作方案定制,保定招聘的渠道有哪些?找工作的人一般都去哪里看招聘信息?  济南企业网站制作公司,济南社保单位网上缴费步骤?  如何在自有机房高效搭建专业网站?  西安专业网站制作公司有哪些,陕西省建行官方网站?  如何快速生成高效建站系统源代码?  建站IDE高效指南:快速搭建+SEO优化+自适应模板全解析  微网站制作教程,不会写代码,不会编程,怎么样建自己的网站?  外贸公司网站制作,外贸网站建设一般有哪些步骤?  如何在服务器上三步完成建站并提升流量?  网页设计网站制作软件,microsoft office哪个可以创建网页?  购物网站制作公司有哪些,哪个购物网站比较好?  股票网站制作软件,网上股票怎么开户?  建站主机选购指南:核心配置与性价比推荐解析  html制作网站的步骤有哪些,iapp如何添加网页?  如何在万网开始建站?分步指南解析  开源网站制作软件,开源网站什么意思?  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?  如何在景安云服务器上绑定域名并配置虚拟主机?  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】  ,柠檬视频怎样兑换vip?  如何用PHP快速搭建高效网站?分步指南  制作网站的软件免费下载,免费制作app哪个平台好?  如何在Golang中引入测试模块_Golang测试包导入与使用实践  如何通过WDCP绑定主域名及创建子域名站点?  网站设计制作公司地址,网站建设比较好的公司都有哪些?  C#如何使用XPathNavigator高效查询XML  TestNG的testng.xml配置文件怎么写  制作证书网站有哪些,全国城建培训中心证书查询官网?  营销式网站制作方案,销售哪个网站招聘效果最好?  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  建站之星24小时客服电话如何获取? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。