我最近在modifyFloat :: (∀ n . Num n => n -> n) -> FloatCompare -> FloatCompare
mofidyFloat f (FloatCompare single double)
= FloatCompare (f single) (f double)
中将我的django制作网络应用从apache+mod_wsgi
切换为nginx+uwsgi
。除了Time Rotated日志文件之外,它还可以。
我的网络应用程序使用名为 appname.log 的日志文件记录所有请求,并使用apache 在午夜轮换而没有任何问题。
使用emperor mode
文件在午夜轮换,但是某些uwsgi进程/工作人员写入此轮换文件(示例轮换文件: appname.log.2017-01-08 )而不是写入进入 appname.log ,导致旋转的文件被覆盖。
解决方案似乎触及uwsgi .ini文件(我不完全确定...),但如果用户仍然连接,我不想重启/重新加载uwsgi到我的应用程序。
我可以使用一种可能性或配置来通知所有uwsgi进程更改日志文件而不重新启动Web应用程序?
如果可能的话,我会在uwsgi
中拥有相同的行为。
ConcurrentLogHandler,太旧了,我不想使用syslog或logrotate:)
有人有同样的问题吗?有人有建议吗?
感谢名单
这是我的设置:
apache+mod_wsgi
答案 0 :(得分:1)
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。但是,此代码将写入控制台。因此,如果要写入文件,则需要编辑侦听器脚本。