我最近遇到了有关设置日志记录级别的日志记录问题。 我有一个demo django项目,它是测试设置日志级别。以下是页面:
日志将写入/tmp/run.log。
当我使用gunicoryn + nginx(代理静态文件)部署它时,有4个gunicorn工作。设置日志级别仅对其中一个工作人员有效:
在这两张图片上方,我将日志级别设置为ERROR
,但仅影响工作人员74096.
以下是一些信息和Django代码。
系统信息:
系统:Centos 7.4 x64
Python:2.7.5
Django:1.11.2
Gunicorn: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名工作人员进行部署,也有问题。
任何人都可以帮助我,谢谢。
答案 0 :(得分:1)
当你用4名工作人员操作gunicorn时,实际上会为你创建4个独立的django应用程序。
然后,当一个请求来到gunicorn时,它会将请求传递给 4个 django应用程序中的一个。(例如,为了平衡4个django应用程序上的负载,所以一个没有压力,其他3人自由地坐着,没有工作)
因此,当您访问主机的8001端口并向服务器发送请求时,只有4个应用程序中的一个接收它并自行处理它。其他3个应用程序有自己独立的内存,没有看到其他应用程序的设置。
您可以通过在应用中设置变量然后将其恢复来检查此行为。例如,您将i = 0作为默认值,然后在一个应用程序中设置i = 1,然后请求包含i值的页面。因为也许另一个应用程序处理了i = 1命令,你有机会看到i的值为0.尝试刷新页面,你有机会看到我是1.每次不同的应用程序回答你的请求时自己的记忆和数据。
作为解决方案您可以使用django应用程序外部的内存。例如,将您的设置或其他参数存储在redis数据库中。当你需要这个设置时,从redis获取它,当你想要更改它时,在redis上更改它。这样,所有4个应用程序都使用共享的redis数据库内存。