我最近从 apache+mod_wsgi
切换了我的 django 生产网络应用程序至 nginx+uwsgi
在 emperor mode
.除了 Time Rotated 日志文件,其他一切都好。
我的 Web 应用程序使用名为 的日志文件appname.log 记录所有请求,并使用 apache 它在午夜旋转没有问题。
与 uwsgi
该文件在午夜轮换,但一些 uwsgi 进程/worker 写入此轮换文件(示例轮换文件:appname.log.2017-01-08)而不是写入 appname.log , 这导致旋转的文件被覆盖 .
一个解决方案似乎是 接触 uwsgi .ini 文件 (我不完全确定......),但如果用户仍然连接到我的应用程序,我不想重新启动/重新加载 uwsgi。
我可以使用一种可能性或配置来通知所有 uwsgi 进程日志文件已更改,而无需重新启动 Web 应用程序?
如果可能的话,我的行为会与 apache+mod_wsgi
中的行为相同.
ConcurrentLogHandler , 太旧了,我不想使用 syslog 或 logrotate :)
有人有同样的问题吗?有人有建议吗?
谢谢
这是我的设置:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'verbose': {
'format': '[%(asctime)s];[%(levelname)s];[Proc:%(process)d];[Thread:%(thread)d];%(module)s-%(funcName)s:%(lineno)d;Msg:%(message)s;'
},
'simple': {
'format': '[%(asctime)s] [%(levelname)s] %(message)s'
},
},
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse'
}
},
'handlers': {
'file': {
'level': 'DEBUG',
'class': 'logging.handlers.TimedRotatingFileHandler',
'filename': LOG_FILE,
'when': 'midnight',
'interval': 1,
'backupCount': 365,
'formatter': 'verbose'
},
'null': {
'level': 'DEBUG',
'class': 'logging.NullHandler',
},
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'verbose'
},
'mail_admins': {
'level': 'ERROR',
'class': 'django.utils.log.AdminEmailHandler',
'filters': ['require_debug_false']
}
},
'loggers': {
APP_NAME: {
'handlers': ['console', 'file'],
'propagate': True,
'level': 'INFO',
},
'django': {
'handlers': ['mail_admins', 'file'],
'level': 'ERROR',
'propagate': True,
},
}
最佳答案
我们用nginx+gunicorn也遇到过同样的问题。我们有非常相似的设置:
LOGGING = {
"version": 1,
"disable_existing_loggers": False,
"formatters": {
"verbose": {"format": "%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s"},
"simple": {"format": "%(levelname)s %(asctime)s %(message)s", "datefmt": "%Y-%m-%d %H:%M"},
},
"filters": {
"require_debug_true": {"()": "django.utils.log.RequireDebugTrue"},
"require_debug_false": {"()": "django.utils.log.RequireDebugFalse"},
},
"handlers": {
"logfile": {
"class": "logging.handlers.TimedRotatingFileHandler",
"when": "D",
"interval": 10,
"backupCount": 100,
"filename": LOG_FILE,
"formatter": "simple",
"level": "DEBUG",
},
},
"loggers": {
APP_NAME: {
"handlers": ["console", "plus_logfile"],
"propagate": True,
"level": "DEBUG",
},
},
}
根据 Python Logging Cookbook - Logging to a single file from multiple processes :
尽管日志记录是线程安全的,并且支持从单个进程中的多个线程记录到单个文件,但不支持从多个进程记录到单个文件,因为没有标准方法可以跨多个序列化对单个文件的访问Python 中的进程。如果您需要从多个进程登录到单个文件,一种方法是让所有进程登录到 SocketHandler,并有一个单独的进程来实现从套接字读取并记录到文件的套接字服务器。 (如果您愿意,可以在现有进程之一中指定一个线程来执行此功能。)
所以最好的方法是有一个套接字监听器,它可以同时监听多个 uwsgi 工作线程和日志。
设置如下所示:
"loggers": {
APP_NAME: {
"handlers": ["console", "plus_logfile"],
"propagate": True,
"level": "DEBUG",
},
},
您可以找到一个示例监听器代码 here .但是,此代码写入控制台。因此,如果要写入文件,则需要编辑监听器脚本。
关于python - django+uwsgi 使用 TimedRotatingFileHandler "overwrites rotated log file"进行日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41559260/