Skip to content

Unfazed 日志

unfazed 提供了简单的进程安全的日志 handler。

背景

在 python 中,logging 是线程安全的,但不是进程安全的,如果 web 应用结合 uvicorn 或者 gunicorn 等采用多进程服务,那么 logging 在并发下就会出现问题。

参考:https://docs.python.org/3/library/logging.html#thread-safety

使用

在以上的背景下,unfazed 提供了一个进程安全的日志 handler,其原理是每个进程都会创建一个独立的日志文件,这样就不会出现多进程写入同一个文件的问题。

使用配置


# settings.py

UNFAZED_SETTINGS = {
    "LOGGING": {
        "version": 1,
        "disable_existing_loggers": False,
        "handlers": {
            "file": {
                "class": "unfazed.logging.handlers.UnfazedRotatingFileHandler",
                "filename": "unfazed.log",
                "formatter": "simple",
            },
        },
        "loggers": {
            "unfazed": {
                "handlers": ["file"],
                "level": "DEBUG",
            },
        },
        "formatters": {
            "simple": {
                "format": "%(asctime)s - %(name)s - %(levelname)s - %(message)s",
            },
        },
    }
}

当各个进程拉起时,会根据进程号以及时间戳为各个进程创建一个独立的日志文件,如下:


>>>unfazed_pid12345_ts1630000000.log
>>>unfazed_pid12346_ts1630000000.log
>>>unfazed_pid12347_ts1630000000.log

高级

关于日志收集系统,大多数公司都有自己的 ELK 日志系统,建议将日志的写入和收集分开,应用程序只负责写入日志,然后在服务器上使用 filebeat 等工具将日志收集到 ELK 系统中。