Skip to main content
 首页 » 编程设计

Python,在 Django 项目中设置日志级别,使用 gunicorn 和 4 个 worker 部署

2025年01月19日28exmyth

我最近遇到了一个关于设置日志记录级别的日志记录问题。 我有一个演示 Django 项目,用于测试设置日志级别。下面是页面:

日志将写入/tmp/run.log。

当我使用 gunicoryn + nginx(代理静态文件)部署它时,有 4 个 gunicorn 工作。设置日志级别只对其中一个worker有效:

上面两张图,我设置日志级别为ERROR,但只影响worker 74096

这里有一些资料和Django代码。

  • 系统信息:

    系统:Centos 7.4 x64 python :2.7.5
    Django :1.11.2
    unicorn :19.7.1

  • Django 日志配置:

    LOGGING = { 
        'version': 1, 
        'disable_existing_loggers': False, 
        'formatters': { 
            'verbose': { 
                'format': '[%(asctime)s] %(levelname)s [%(filename)s:%(lineno)s] %(message)s' 
            } 
        }, 
        'handlers': { 
            'file': { 
                'level': 'DEBUG', 
                'class': 'logging.handlers.RotatingFileHandler', 
                'maxBytes': 1024, 
                'backupCount': 5, 
                'filename': '/tmp/run.log', 
                'formatter': 'verbose' 
            }, 
            'console': { 
                'level': 'DEBUG', 
                'class': 'logging.StreamHandler', 
                'formatter': 'verbose' 
    
  • 设置日志级别函数

    name = "django_docker" 
    bind = "unix:/var/run/django_docker.sock" 
    worker_class = "egg:meinheld#gunicorn_worker" 
    #workers = multiprocessing.cpu_count() * 2 + 1 
    workers = 4 
    reload = True 
     
    umask = 0002 
    user = 'nginx' 
    group = 'nginx' 
     
    accesslog = "/tmp/gunicorn.access.log" 
    errorlog = "/tmp/gunicorn.error.log" 
     
    raw_env = ["DJANGO_SETTINGS_MODULE=django_docker.settings"] 
    chdir = " /home/user/workspace/django_docker/" 
    pidfile = "/var/run/gunicorn.pid" 
    daemon = True 
     
    logconfig_dict = { 
        'version':1, 
        'disable_existing_loggers': False, 
        'loggers':{ 
            "root": {"level": "INFO", "handlers": ["console"]}, 
            "gunicorn.error": { 
                "level": "INFO", 
                "handlers": ["error_file"], 
                "propagate": 1, 
                "qualname": "gunicorn.error" 
            }, 
     
            "gunicorn.access": { 
                "level": "INFO", 
                "handlers": ["access_file"], 
                "propagate": 0, 
                "qualname": "gunicorn.access" 
            } 
        }, 
        'handlers':{ 
            "console": { 
                "class": "logging.StreamHandler", 
                "formatter": "generic", 
                "stream": "sys.stdout" 
            }, 
            "error_file": { 
                "class": "logging.FileHandler", 
                "formatter": "generic", 
                "filename": "/tmp/gunicorn.error.log" 
            }, 
            "access_file": { 
                "class": "logging.handlers.RotatingFileHandler", 
                "maxBytes": 1024*1024, 
                "backupCount": 5, 
                "formatter": "generic", 
                "filename": "/tmp/gunicorn.access.log", 
            } 
        }, 
        'formatters':{ 
            "generic": { 
                "format": "%(asctime)s [%(process)d] [%(levelname)s] %(message)s", 
                "datefmt": "[%Y-%m-%d %H:%M:%S %z]", 
                "class": "logging.Formatter" 
            }, 
            "access": { 
                "format": "%(message)s", 
                "class": "logging.Formatter" 
            } 
        } 
    } 
    

此外,我尝试使用 uwsgi 和 4 个 worker 进行部署,也有问题。

谁能帮帮我,谢谢。

请您参考如下方法:

当您使用 4 个 worker 运行 gunicorn 时,它实际上会为您创建 4 个独立的 django 应用程序。

然后,当请求到达 gunicorn 时,它会将请求传递给 4 个 django 应用程序中的一个。(例如,平衡 4 个 django 应用程序的负载,这样一个应用程序就不会承受压力,并且其他 3 人自由地坐着,没有工作)

因此,当您访问主机的 8001 端口并向服务器发送请求时,只有 4 个应用程序之一接收并自行处理。其他 3 个应用程序有自己的独立内存,看不到其他应用程序的设置。

您可以通过在您的应用中设置变量然后取回它来检查此行为。例如,您将 i=0 作为默认设置,然后在一个应用程序中设置 i=1,然后请求包含 i 值的页面。因为也许另一个应用程序已经处理了 i=1 命令,你有机会看到 i 的值为 0。尝试刷新页面,你有机会看到 i 为 1。每次不同的应用程序用它的回答你的请求自己的内存和数据。

作为解决方案,您可以使用 Django 应用程序外部的内存。例如将您的设置或其他参数存储在 redis 数据库中。当你需要那个设置时,从redis获取它,当你想改变它时,在redis上改变它。这样,所有 4 个应用程序都使用共享的 redis 数据库内存。