Skip to main content

Cross-process logging via a dedicated log server process and SocketHandler.

Project description

kitty_logger

单机跨进程的 Python 日志库。主进程启动一个独立的"日志服务"子进程,所有 通过 spawn 创建的子进程把 LogRecordlogging.handlers.SocketHandler 发到这里,由它统一落盘 / 输出到 stderr不会出现多进程并发写文件的 错行或丢失问题

适用范围。 公司内部研发协作环境:单台主机、本机所有进程都互相信任、 追求"用起来简单"而不是"对抗外部威胁"。不适用于生产部署或多租户机器 等不能信任本机其他进程的场景。

安装

pip install kitty-logger

用法

# main.py
import multiprocessing as mp
import kitty_logger

def worker(i):
    log = kitty_logger.getLogger(f"worker.{i}")
    log.info("hello from worker %d", i)

if __name__ == "__main__":
    kitty_logger.setup_logging(log_file="app.log")
    log = kitty_logger.getLogger("main")
    log.info("starting")

    with mp.get_context("spawn").Pool(4) as pool:
        pool.map(worker, range(4))

setup_logging 会写入环境变量 KITTY_LOGGER_HOST / KITTY_LOGGER_PORT / KITTY_LOGGER_LEVEL;任意层级 spawn 出来的后代进程会自动继承,从而能在零配置的情况下连上日志服务。

API

  • setup_logging(log_file=None, level=logging.INFO, host="127.0.0.1", port=0, stream=True, console_fmt=..., file_fmt=..., datefmt=None, attach_main_logger=True) -> (host, port) 启动日志服务子进程(始终使用 spawn)。幂等。已通过 atexit 注册清理。 port=0 让操作系统挑选空闲端口;返回真实绑定到的 (host, port)host 必须是 loopback——绑定非 loopback 地址会直接 ValueError
  • getLogger(name=None) -> logging.Logger 返回一个挂好 SocketHandler、指向日志服务的 logger。
  • shutdown_logging() — 显式停止日志服务子进程。

为什么只支持 spawn

fork 出来的子进程会继承父进程已经建立的 SocketHandler 及其底层 TCP 连接。父子进程会在同一个 socket 上交叉写 pickle 字节流,导致服务端反 序列化必然失败。此外 fork 在多线程父进程中不安全(其他线程持有的锁 会原样留在子进程里,引发死锁),且在 Windows 上不被支持。

请使用 multiprocessing.get_context("spawn"),或在顶层用 if __name__ == "__main__": 守卫配合 Python 默认行为。

注意事项

  • 不要setup_logging(attach_main_logger=True) 之前调用 logging.basicConfig()(或自行给 root logger 挂 StreamHandler)—— 否则主进程会把每条记录输出两次:一次走本地 root handler,一次走日志 服务。要么让 kitty_logger 做唯一的配置入口,要么传 attach_main_logger=False 自行管理主进程的 handler。
  • shutdown_logging() 会卸载本进程内 kitty_logger 自己挂的 SocketHandler,并清理 KITTY_LOGGER_* 环境变量,确保进程状态与 setup_logging 对称。如果你额外挂了别的 handler,仍由你自己负责清理。

安全性

服务端用 pickle.loads 反序列化收到的字节流——这等价于在本机上对攻击者 可控的输入做"任意代码执行"。为了让这个能力永远不会跨出本机setup_logging 在打开 socket 之前就会直接拒绝任何非 loopback 绑定ValueError)。监听端口仅本机可达;请把它视为受信任的内部接口,不要 在不能信任本机其他进程的多租户机器上运行。

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

kitty_logger-0.2.0.dev0.tar.gz (18.5 kB view details)

Uploaded Source

Built Distribution

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

kitty_logger-0.2.0.dev0-py3-none-any.whl (17.5 kB view details)

Uploaded Python 3

File details

Details for the file kitty_logger-0.2.0.dev0.tar.gz.

File metadata

  • Download URL: kitty_logger-0.2.0.dev0.tar.gz
  • Upload date:
  • Size: 18.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.5

File hashes

Hashes for kitty_logger-0.2.0.dev0.tar.gz
Algorithm Hash digest
SHA256 13b4cb31fe4ff0fe154970915d228df0fdc26e51e4ef0d801f41b7b1b2d93a19
MD5 b0f312ed5aaa6113f0abbfb86fffd773
BLAKE2b-256 246e44acb013aac3b8b15c7a48917df947ef8802495f515a5872344860dc515f

See more details on using hashes here.

File details

Details for the file kitty_logger-0.2.0.dev0-py3-none-any.whl.

File metadata

File hashes

Hashes for kitty_logger-0.2.0.dev0-py3-none-any.whl
Algorithm Hash digest
SHA256 e682191fbf969854654d5cacc43f0da87af3a938ac1470ab76fe09138b758c26
MD5 2e3bf06b0ba461260e165f12735b78ef
BLAKE2b-256 de4a7a1cc3723ca0b3d35394df95dc160e1c1e9543415b50fbfca59020f59496

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