Skip to main content

A high-performance multiprocess-safe asynchronous logging tool.一个支持多进程多线程的日志封装库

Project description

py-async-log

License Python Version

py-async-log 是一个高性能、多线程、多进程安全的异步日志工具,专为解决Python多线程、多进程环境下的日志竞争与阻塞问题而设计。

注意:当前是第一个版本,可能会有很多未完善的地方。

🚀 核心特性

  • 多进程安全:基于 multiprocessing.Manager 队列,完美支持跨进程日志收集。
  • 异步非阻塞:主进程与子进程仅负责将日志推入队列,磁盘IO由独立的监听线程处理。
  • 防止乱序:确保多进程并发写入时日志记录的完整性与顺序性。
  • 轻量易用:模块化单例设计,几行代码即可完成全项目日志配置。

在标准 logging 库中,多进程同时写入同一个文件会导致:

  1. 内容覆盖:多个进程竞争文件锁,可能导致日志行破碎或丢失。
  2. 性能瓶颈:磁盘 IO 是慢速操作,同步写入会阻塞业务逻辑。 py-async-log 通过生产者-消费者模型,将所有进程的日志汇聚到统一队列,由主进程单线程写入,彻底规避了上述问题。

📦 安装

使用 pip 直接安装:

pip install py-async-log

🛠️ 快速开始

import logging
import multiprocessing
import os
import time

from py_async_log import get_manager

# 定义一个临时的日志文件名
TEST_LOG_FILE = "test_run.log"


def worker_task(config_info, message):
    """模拟子进程任务"""
    # 解包:config_info 是 (函数, 参数)
    config_fn, args = config_info
    config_fn(*args)  # 执行初始化

    logger = logging.getLogger("test_worker")
    logger.info(message)


def test_multiprocessing_logging():
    """测试多进程日志是否能正确写入同一个文件"""

    # 1. 环境清理:如果上次测试残留了日志文件,先删除
    if os.path.exists(TEST_LOG_FILE):
        os.remove(TEST_LOG_FILE)

    # 2. 初始化管理器
    log_mgr = get_manager(TEST_LOG_FILE, level=logging.INFO)
    log_mgr.start_logging()

    try:
        # 获取可以序列化的配置信息
        config_info = log_mgr.get_worker_config_args()

        # 3. 启动多个子进程同时写日志
        messages = [f"测试消息 from process {i}" for i in range(3)]
        processes = []

        for msg in messages:
            p = multiprocessing.Process(target=worker_task, args=(config_info, msg))
            p.start()
            processes.append(p)

        for p in processes:
            p.join()

        # 4. 给一点缓冲时间让 QueueListener 完成写入操作
        time.sleep(0.5)
        log_mgr.stop_logging()

        # 5. 验证结果
        assert os.path.exists(TEST_LOG_FILE), "日志文件未生成"

        with open(TEST_LOG_FILE, "r", encoding="utf-8") as f:
            content = f.read()
            for msg in messages:
                assert msg in content, f"日志中缺失消息: {msg}"
    except Exception as e:
        print(f"测试过程中发生错误: {e}")
        raise
    finally:
        # 6. 测试完成后清理
        if os.path.exists(TEST_LOG_FILE):
            os.remove(TEST_LOG_FILE)


if __name__ == "__main__":
    test_multiprocessing_logging()

📜 开源协议

本项目采用 Apache License 2.0 协议。

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

py_async_log-0.0.3.tar.gz (9.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

py_async_log-0.0.3-py3-none-any.whl (9.2 kB view details)

Uploaded Python 3

File details

Details for the file py_async_log-0.0.3.tar.gz.

File metadata

  • Download URL: py_async_log-0.0.3.tar.gz
  • Upload date:
  • Size: 9.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.0

File hashes

Hashes for py_async_log-0.0.3.tar.gz
Algorithm Hash digest
SHA256 c3f2d68477db5ceeada55ae595bf5666883f033d7ffa78904300de5a44055e38
MD5 a2189a8012b1050a2b2aa02f2be42ab6
BLAKE2b-256 c12c83c92d8463ba3179b252951ce92c60102fb6aa4aad3aa7bed3553c9e68b1

See more details on using hashes here.

File details

Details for the file py_async_log-0.0.3-py3-none-any.whl.

File metadata

  • Download URL: py_async_log-0.0.3-py3-none-any.whl
  • Upload date:
  • Size: 9.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.0

File hashes

Hashes for py_async_log-0.0.3-py3-none-any.whl
Algorithm Hash digest
SHA256 ad278346ef5b50f6937d0e5b493cea5fc01e6a00c0e24c72e8dd17eb8977ab98
MD5 cccc6d089579a0421c8c613e9de4c7d1
BLAKE2b-256 e78c58d8f73d57554fc02b8cea210f98cc542efb8b180733609933d324a40abc

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page