python多进程log日志问题_Python 如何安全地实现实现多进程日志以及日志正常的分割...

在Python中我们经常需要使用到多进程来提高我们程序性能,但是多进程的编程中经常有各种各样的问题来困扰我们,比如多进程和多线程的公用导致的子进程的卡死,进程间的通信等问题.还有一个问题我们也许不经常注意到,就是日志的记录.对于一些一次性的任务来说这个问题基本不存在,但是对于一些需要长期运行的Python任务,以及日志记录会比较多的任务来说,比如我们经常使用的各种Web框架,例如Flask和Tornado以及Django等.

1. 我们通常使用的Python的自带模块logging来记录日志,但是官方文档已经明确指出:这个模块不支持多进程,支持多线程.所以对于多进程的实现就需要我们自己来完成了.

2. 其实网络上已经有许多对于logging模块的多进程实现,基本都是使用了文件锁fcntl来实现的,我们也参考他们使用该模块,logging模块打印日志的都是由最终的hangdler实现的,所以我们只需要实现一个支持多进程打印日志的Handler即可.

3. 分析BaseRotatingHandler模块并结合官方文档,我们发现emit方法是最终处理日志输出的方法以及进行日志轮转的地方于是我们将锁加在这里,我们就将锁加在这个函数上面.

defemit(self, record):"""Emit a record.

Output the record to the file, catering for rollover as described

in doRollover()."""

try:ifself.shouldRollover(record):

self.doRollover()

logging.FileHandler.emit(self, record)exceptException:

self.handleError(record)

4. 文件锁的使用,fcntl的使用

这个锁只在linux上可以使用,但是一般来说我们的运行环境都是在liunx上其实问题不大.这个锁有好几种,我们这里只需要做到进程间的日志打印,所以使用排他锁.

importfcntl

file_path= "/home/ubuntu/aaa.json"f= open(file_path, 'w')

fcntl.flock(f.fileno(), fcntl.LOCK_EX)#加锁,其它进程对文件操作则不能成功

f.write("something")

fcntl.flock(f.fileno(), fcntl.LOCK_UN)#解锁

f.close()

5. 具体实现

importloggingimportosimportfcntlfrom logging.handlers importRotatingFileHandlerclassMyRotatingFileHandler(RotatingFileHandler):defemit(self, record):"""Emit a record.

Output the record to the file, catering for rollover as described

in doRollover()."""f=None

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip
Python Web 项目中,多进程日志需要考虑多个进程同时写入同一个文件的问题。为了避免不同进程之间的写入操作互相干扰,可以使用 Python 标准库中的 `logging` 模块,并将日志输出到不同的文件中。 下面是一个示例代码: ```python import logging import multiprocessing import os def process_task(): # 设置日志输出格式 log_format = '%(asctime)s %(levelname)s %(processName)s %(message)s' logging.basicConfig(level=logging.INFO, format=log_format) # 获取当前进程 ID process_id = os.getpid() # 创建一个 FileHandler 对象,并指定日志输出文件 file_handler = logging.FileHandler(f'log_{process_id}.txt') file_handler.setLevel(logging.INFO) file_handler.setFormatter(logging.Formatter(log_format)) # 将 FileHandler 添加到 logger 对象中 logger = logging.getLogger() logger.addHandler(file_handler) # 写入日志信息 logger.info('This is a log message from process %d.', process_id) if __name__ == '__main__': # 创建多个进程 processes = [] for i in range(5): p = multiprocessing.Process(target=process_task) processes.append(p) p.start() # 等待所有进程完成 for p in processes: p.join() ``` 在上面的代码中,我们首先定义了一个 `process_task` 函数,该函数会在每个进程中被调用。在 `process_task` 函数中,我们首先设置了日志输出的格式,然后获取当前进程 ID,创建了一个 `FileHandler` 对象,并将其添加到 `logger` 对象中。最后,我们使用 `logger` 对象写入了一条日志信息。 在 `__main__` 函数中,我们创建了 5 个进程,并等待所有进程完成。在每个进程中,都会执行 `process_task` 函数,并将日志输出到不同的文件中。 这样,我们就可以在多进程Python Web 项目中,实现日志的并发写入了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值