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

标签 python django logging gunicorn

我最近遇到了有关设置日志记录级别的日志记录问题。 我有一个demo django项目,它是用来测试设置日志级别的。以下是页面:

enter image description here

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

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

enter image description here

enter image description here

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

这里是一些信息和 Django 代码。

  • 系统信息:

    系统:Centos 7.4 x64 Python:2.7.5
    Django :1.11.2
    骟角兽: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 个工作线程运行 Gunicorn 时,它实际上会为您创建 4 个独立的 django 应用程序

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

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

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

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

关于Python,在Django项目中设置日志级别,使用gunicorn和4个worker部署,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47787869/

相关文章:

python - 限制 IP 地址以访问您在 GAE 上的应用程序?

python - 压缩音频数据的快速方法?

java - 我如何在Java中进行定时器登录并分析结果?

python - 基于另一个 Python 创建一列

python - 加密字符串以获得固定长度

python - Heroku 部署错误 : No matching distribution found for en-core-web-sm

django - post_syncdb 上不存在 ContentType 匹配查询

Django:admin.py 不存在?

python - Django 错误记录 : Adding request header, 正文和用户信息

linux - 如何使用 Nagios 监控生成随机 ID 的日志文件