用TimedRotatingFileHandler记录django + uwsgi“覆盖旋转的日志文件”

时间:2017-01-10 00:22:50

标签: python django logging nginx uwsgi

我最近在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

1 个答案:

答案 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。但是,此代码将写入控制台。因此,如果要写入文件,则需要编辑侦听器脚本。