用gevent(或封装了gevent的gunicore)启动python进程,会出现多个独立进程同时写一个日志文件,
可以观察到有日志部分丢失:一个进程日志没写完,另一个进程把日志覆盖在同一行的后面;有些日志甚至完全丢失。
用mlogging包可以解决多进程写日志的问题,没有发现不完整的日志,是否丢失日志有待进一步检测。
下面是一个在python程序中记录重要信息,以便以后解析统计的函数
# -*- coding: utf-8 -*-
import os.path
import logging
from mlogging import FileHandler_MP, TimedRotatingFileHandler_MP
from functools import partial
class LevelFilter(logging.Filter):
def __init__(self, level, *args, **kwargs):
#super(LevelFilter, self).__init__(*args, **kwargs)
self.level = level
def filter(self, record):
return record.levelno == self.level
def init_info_logger(name, logging_dir):
logging_file = os.path.join(logging_dir, name+".log")
handler = TimedRotatingFileHandler_MP(logging_file, "midnight", 1)
handler.setFormatter( logging.Formatter(
"%(asctime)s %(levelname)-8s %(name)-20s %(message)s", #设置日志格式,固定宽度便于解析
datefmt = "%Y-%m-%d %H:%M:%S" #设置asctime时间格式
))
handler.suffix = "%Y%m%d"
#只记录INFO级别信息,抛弃上面的WARNING、ERROR、CRITICAL几个级别
handler.addFilter( LevelFilter(logging.INFO) )
logger = logging.getLogger(name)
logger.setLevel(logging.INFO)
#有些Python版本会报错KeyError,找不到clientip或user,这里用一个短横(-)做默认值
extra={"clientip":"-", "user":"-"}
#exc_info是出错时的Debug详细回溯信息,这里禁止记录,只记录错误信息这一行
setattr(logger, "info", partial(logger.info, exc_info=False, extra=extra))
logger.addHandler( handler )
return logger
def init_error_logger(logging_dir):
logging_file = os.path.join(logging_dir, "errors.log")
handler = FileHandler_MP(logging_file)
handler.setFormatter( logging.Formatter(
"%(asctime)s %(levelname)-8s %(message)s", #设置日志格式,固定宽度便于解析
datefmt = "%Y-%m-%d %H:%M:%S" #设置asctime时间格式
))
logger = logging.getLogger()
logger.setLevel(logging.WARNING)
#有些Python版本会报错KeyError,找不到clientip或user,这里用一个短横(-)做默认值
extra={"clientip":"-", "user":"-"}
#exc_info是出错时的Debug详细回溯信息
setattr(logger, "critical", partial(logger.critical, exc_info=True, extra=extra))
setattr(logger, "error", partial(logger.error, exc_info=True, extra=extra))
setattr(logger, "warning", partial(logger.warning, exc_info=True, extra=extra))
logger.addHandler( handler )
return logger
if __name__ == "__main__":
logger = init_info_logger("test", "./")
logger.debug("低级别的DEBUG,不会记录。")
logger.info("哈哈哈,这才是我想要的信息,请记下来。")
logger.error("高级别的ERROR,也被过滤掉。")
分享到:
相关推荐
python多进程下实现日志记录按时间分割,供大家参考,具体内容如下 原理:自定义日志handler继承TimedRotatingFileHandler,并重写computeRollover与doRollover函数。其中重写computeRollover是为了能按整分钟/小时/...
更主要是 讨论在多进程环境下如何使用logging 来输出日志, 如何安全地切分日志文件。 1. logging日志模块介绍 python的logging模块提供了灵活的标准模块,使得任何Python程序都可以使用这个第三方模块来实现日志...
许多应用程序中都会有日志模块,用于记录系统在运行过程中的一些关键信息,以便于对系统的运行...这篇文章给大家主要介绍了在Python中logging日志模块在多进程环境下的使用,需要的朋友可以参考借鉴,下面来一起看看吧。
1. 使用多进程技术,每一个进程读取一个txt文件 2. 使用协程技术,批量读取txt文件记录。比如一次性读取 2000条记录 注意:打开文件操作,最好在一个进程中,重复打开文件,会造成系统资源浪费! 二、完整代码 #!/...
由于默认 Python 多进程队列的性能限制,您需要不经常更新全局和工作进程 tqdms 以避免淹没主进程。 我将尝试在某个时候实现一个无锁环缓冲区,看看是否可以改进。 安装 pip install tqdm-multiprocess 用法 ...
使用Python来写后台任务时,时常需要使用输出日志来记录程序运行的状态,并在发生错误时将错误的详细信息保存下来,以别调试和...本文就介绍了python中日志logging模块性能及多进程的相关资料,需要的朋友可以参考下。
主要介绍了Python使用修饰器进行异常日志记录操作,结合实例形式分析了Python基于修饰器的log日志文件操作的相关实现技巧,需要的朋友可以参考下
多个记录器可以写入同一个日志文件(也可以跨多个Python文件和进程)。 具有全局默认记录器和具有自定义记录器。 兼容Python 2和3。 全部包含在一个。 根据MIT许可获得许可。 受启发。 安装: python -m pip ...
⑦ 并发编程(如多线程、多进程); ⑧ 数据分析和可视化(如使用pandas、matplotlib等库)。 阅读建议: 建议您按照代码示例的顺序逐个学习,从基础到高级逐步深入。在学习的过程中,不仅要理解每个代码示例的功能...
14.4 将测试输出用日志记录到文件中 14.5 忽略或者期望测试失败 14.6 处理多个异常 14.7 捕获所有异常 14.8 创建自定义异常 14.9 捕获异常后抛出另外的异常 14.10 重新抛出最后的异常 14.11 输出警告信息 ...
10 多进程的调用 第35章 01 进程通信 02 进程池 03 协程 04 事件驱动模型 05 IO模型前戏 06 阻塞IO与非阻塞IO 07 select及触发方式 08 select监听多连接 09 select与epoll的实现区别 第36章 01 异步IO 02 ...
该模块为Python的标准日志记录程序包(PEP 282)提供了一个额外的日志处理程序。 该处理程序会将日志事件写入日志文件,该日志文件在特定时间(天,小时,分钟)轮换并支持多个进程。 这个模块提供了一个Python日志...
52 8.05scrapy中日志记录器.mp4 53 8.06扩展解释器的excepthook.mp4 54 8.07自定义Selenium下载中间件.mp4 55 9.01回顾知识点.mp4 56 9.02分布式爬虫.mp4 57 9.03爬虫项目完整调试.mp4 58 9.04Linux云服务器...
eliot是一个Python日志记录系统,它输出动作的因果链:动作可以产生其他动作,最终它们要么成功要么失败。 生成的日志会告诉您有关您的软件执行情况的故事:发生了什么以及导致它的原因。 Eliot支持一系列用例和第...
我花了太多时间试图从没有足够信息的日志中识别有关错误的详细信息。 能够打开调试器并将崩溃的进程的整个堆栈加载到其中,然后像在自己的计算机上崩溃一样环顾四周,这不是很好吗? 可能的用途 该项目(或方法)在...
查看 Python 进程的一些日志记录。 键入 CTRL+]、回车、CTRL+D 退出 telnet。 更多! 细节 有关更多信息,请参阅 WAOL.doc 有更多信息吗? 请添加到 ArchiveTeam wiki 并告诉我们! 非常感谢贡献和反馈。