用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`是一个强大的工具,用于记录程序运行过程中的各种信息。在多进程环境中,正确地使用`logging`模块尤...在实际应用中,开发者应根据具体需求选择合适的方法来处理多进程环境下的日志。
在Python编程中,多进程是并行处理的一种方式,它允许多个任务同时运行,以提高程序执行效率。尤其在处理耗时较长的任务,如发送大量邮件时,使用多进程可以显著缩短整体处理时间。本课程设计的目标是利用Python实现...
此外,可以使用多线程或多进程并行处理日志,提高效率。 在"PyWebLog-master"这个压缩包中,可能包含了源代码文件、测试数据、文档说明等。通过查看源代码,我们可以深入学习作者是如何实现上述功能的,以及他们是...
在IT领域,尤其是在软件开发中,...总的来说,"Python-进程启动器"是一个实用的开发工具,它将Python进程的管理和启动过程封装得更加友好和高效,对于需要处理多进程环境的开发者来说,这是一个值得学习和使用的工具。
7. **日志记录**:使用`logging`库记录程序的运行状态和异常信息,方便排查问题和分析日志。 8. **多线程或异步编程**:为了不影响主程序的执行,守护进程的检查和恢复操作可能需要在单独的线程或异步任务中进行。...
1. **调试多线程或多进程问题**:它可以让你在不同线程或进程中切换,查看每个线程的状态。 2. **生产环境调试**:在不重启服务的情况下定位并解决问题,这对于不能容忍服务中断的高可用系统至关重要。 3. **性能...
### Python中日志logging模块的性能及多进程详解 #### 前言 在Python开发过程中,特别是编写后台任务或长时间运行的服务时,记录程序运行状态及错误信息变得尤为重要。Python标准库中的`logging`模块提供了强大的...
在性能方面,daiquiri利用了Python的异步特性,可以在多线程或多进程环境中高效地处理日志。这确保了即使在高负载情况下,日志记录也不会成为程序性能的瓶颈。 daiquiri-master这个压缩包可能包含了daiquiri库的源...
在Django应用中,日志记录是至关重要的,特别是在多进程环境中,确保日志的正确滚动和同步是非常必要的。本文将深入探讨Django在多进程中遇到的滚动日志问题及其解决方案。 滚动日志问题通常出现在Django应用启动多...
- **日志的过滤与格式化**:进一步定制日志输出格式,例如加入额外的信息如线程ID、进程ID等,或者使用过滤器只记录特定的日志条目。 通过以上详细的介绍和实现过程,我们可以看出Python中的`logging`模块不仅功能...
3. **多线程安全**:在多线程或多进程环境中,`enhanced_logging`确保了日志记录的线程安全,避免了并发写入时可能出现的问题。 4. **自定义处理器和过滤器**:除了标准的日志处理器,如StreamHandler和FileHandler...
由于默认 Python 多进程队列的性能限制,您需要不经常更新全局和工作进程 tqdms 以避免淹没主进程。 我将尝试在某个时候实现一个无锁环缓冲区,看看是否可以改进。 安装 pip install tqdm-multiprocess 用法 ...
在Python编程中,多进程和协程是两种不同的并发处理方式,它们各有优势,并且可以协同工作以提高程序效率。本示例展示了如何在处理大量数据时,利用多进程读取文件并用协程进行数据处理,从而实现高效的数据处理流程...
通过以上的理解,我们可以看出Python的`multiprocessing.Pool`提供了一种高效且灵活的方式来管理和控制多进程,同时通过适当的异常处理,能够确保程序在遇到错误时仍能继续运行,并记录异常信息。这在编写可靠且可...
10. 日志记录(服务器的运行状态记录) 综合以上分析,这个"单线程单进程服务器pythondemo"项目是一个学习Python网络编程基础的好资源,涵盖了从创建服务器到进行基本测试的整个流程。对于初学者,它能帮助理解...